From 90e8741fb7ffb0ab55f5f479dbb38743352b795e Mon Sep 17 00:00:00 2001 From: nym21 Date: Wed, 3 Jun 2026 12:34:05 +0200 Subject: [PATCH] website: redesign part 1 --- website/AGENTS.md | 4 + .../{assets/favicon => }/apple-touch-icon.png | Bin .../web-app-manifest-192x192.png | Bin .../web-app-manifest-512x512.png | Bin website/cube/index.js | 33 + website/cube/style.css | 132 + website/{scripts => }/entry.js | 0 .../{assets/favicon => }/favicon-96x96.png | Bin website/{assets/favicon => }/favicon.ico | Bin website/{assets/favicon => }/favicon.svg | 0 website/header/index.js | 21 + website/header/style.css | 74 + website/index.html | 178 +- website/main.js | 1 + website/manifest.webmanifest | 16 +- website/scripts/modules | 1 - website/styles/fonts.css | 9 + website/styles/variables.css | 14 +- website_bkp/.gitignore | 6 + website_bkp/.well-known/ai-plugin.json | 15 + website_bkp/AGENTS.md | 23 + .../assets/favicon/apple-touch-icon.png | Bin 0 -> 5567 bytes website_bkp/assets/favicon/favicon-96x96.png | Bin 0 -> 3847 bytes website_bkp/assets/favicon/favicon.ico | Bin 0 -> 15086 bytes website_bkp/assets/favicon/favicon.svg | 43 + .../assets/favicon/site.webmanifest | 0 .../favicon/web-app-manifest-192x192.png | Bin 0 -> 6402 bytes .../favicon/web-app-manifest-512x512.png | Bin 0 -> 21883 bytes .../assets/fonts/InstrumentSerif-Italic.woff2 | Bin 0 -> 27772 bytes .../fonts/InstrumentSerif-Regular.woff2 | Bin 0 -> 27212 bytes .../Lilex-Italic[wght]-v2_620.woff2.woff2 | Bin 0 -> 105900 bytes .../assets/fonts/Lilex[wght]-v2_620.woff2 | Bin 0 -> 93604 bytes website_bkp/assets/logo/.gitignore | 1 + website_bkp/assets/logo/demo-svg.html | 379 + website_bkp/assets/logo/demo.html | 650 + website_bkp/assets/logo/logo-dark.svg | 37 + website_bkp/assets/logo/logo-light.svg | 37 + website_bkp/assets/logo/logo-orange.svg | 37 + website_bkp/assets/logo/logo.svg | 57 + website_bkp/assets/pools.sh | 10 + website_bkp/assets/pools/1thash.svg | 11 + website_bkp/assets/pools/antpool.svg | 1 + website_bkp/assets/pools/arkpool.svg | 14 + website_bkp/assets/pools/binancepool.svg | 11 + website_bkp/assets/pools/bitcoincom.svg | 22 + website_bkp/assets/pools/bitfufupool.svg | 19 + website_bkp/assets/pools/bitfury.svg | 12 + website_bkp/assets/pools/braiinspool.svg | 15 + website_bkp/assets/pools/braiinssolo.svg | 10 + website_bkp/assets/pools/btccom.svg | 22 + website_bkp/assets/pools/btclab.svg | 1 + website_bkp/assets/pools/btctop.svg | 14 + website_bkp/assets/pools/default.light.svg | 1 + website_bkp/assets/pools/default.svg | 1 + website_bkp/assets/pools/emcdpool.svg | 17 + website_bkp/assets/pools/est3lar.svg | 2 + website_bkp/assets/pools/f2pool.svg | 23 + website_bkp/assets/pools/foundryusa.light.svg | 1 + website_bkp/assets/pools/foundryusa.svg | 1 + website_bkp/assets/pools/gdpool.svg | 13 + website_bkp/assets/pools/huobipool.svg | 75 + website_bkp/assets/pools/innopolistech.svg | 144 + website_bkp/assets/pools/kucoinpool.svg | 11 + website_bkp/assets/pools/luxor.svg | 24 + website_bkp/assets/pools/marapool.svg | 6 + website_bkp/assets/pools/maxipool.svg | 6 + website_bkp/assets/pools/minerium.svg | 3 + website_bkp/assets/pools/miningsquared.svg | 136 + website_bkp/assets/pools/mononaut.svg | 122 + website_bkp/assets/pools/neopool.svg | 5 + website_bkp/assets/pools/nicehash.svg | 14 + website_bkp/assets/pools/ocean.svg | 15 + website_bkp/assets/pools/okexpool.svg | 24 + website_bkp/assets/pools/okkong.svg | 57 + website_bkp/assets/pools/parasite.svg | 127 + website_bkp/assets/pools/pegapool.svg | 13 + website_bkp/assets/pools/phoenix.svg | 218 + website_bkp/assets/pools/poolin.svg | 13 + website_bkp/assets/pools/publicpool.svg | 301 + website_bkp/assets/pools/rawpool.svg | 27 + website_bkp/assets/pools/sbicrypto.svg | 14 + website_bkp/assets/pools/secpool.svg | 8 + website_bkp/assets/pools/sigmapoolcom.svg | 11 + website_bkp/assets/pools/slushpool.svg | 81 + website_bkp/assets/pools/solopoolcom.svg | 56 + website_bkp/assets/pools/spiderpool.svg | 6 + website_bkp/assets/pools/terrapool.svg | 1 + website_bkp/assets/pools/titan.svg | 5 + .../assets/pools/ultimuspool.light.svg | 1 + website_bkp/assets/pools/ultimuspool.svg | 1 + website_bkp/assets/pools/unknown.light.svg | 1 + website_bkp/assets/pools/unknown.svg | 1 + website_bkp/assets/pools/viabtc.svg | 20 + website_bkp/assets/pools/wayicn.svg | 11 + website_bkp/assets/pools/whitepool.light.svg | 28 + website_bkp/assets/pools/whitepool.svg | 28 + website_bkp/assets/pools/wiz.svg | 41 + website_bkp/index.html | 194 + website_bkp/jsconfig.json | 10 + website_bkp/llms-full.txt | 497 + website_bkp/llms.txt | 32 + website_bkp/manifest.webmanifest | 43 + website_bkp/robots.txt | 9 + {website => website_bkp}/scripts/_types.js | 0 website_bkp/scripts/entry.js | 1 + .../scripts/explorer/address.js | 0 .../scripts/explorer/block.js | 0 .../scripts/explorer/chain.js | 0 .../scripts/explorer/cube.js | 0 .../scripts/explorer/index.js | 0 .../scripts/explorer/mempool.js | 0 .../scripts/explorer/render.js | 0 .../scripts/explorer/tx.js | 0 {website => website_bkp}/scripts/main.js | 0 website_bkp/scripts/modules/.gitignore | 14 + .../scripts/modules/brk-client/.gitignore | 1 + .../scripts/modules/brk-client/index.js | 12226 ++++++++++++++++ .../scripts/modules/brk-client/jsconfig.json | 10 + .../scripts/modules/brk-client/package.json | 44 + .../scripts/modules/brk-client/tests/basic.js | 66 + .../modules/brk-client/tests/consistency.js | 132 + .../modules/brk-client/tests/metric_data.js | 248 + .../scripts/modules/brk-client/tests/tree.js | 102 + .../scripts/modules/brk-client/tsconfig.json | 13 + .../scripts/modules/lean-qr/.gitignore | 1 + .../scripts/modules/lean-qr/2.7.1/index.d.ts | 653 + .../scripts/modules/lean-qr/2.7.1/index.mjs | 2 + .../modules/lightweight-charts/.gitignore | 2 + ...ghtweight-charts.standalone.production.mjs | 8 + .../5.2.0/dist/typings.d.ts | 5041 +++++++ .../modules/quickmatch-js/0.5.0/src/index.js | 433 + website_bkp/scripts/modules/tsconfig.json | 15 + website_bkp/scripts/modules/unpkg.sh | 410 + .../scripts/options/cointime.js | 0 .../scripts/options/constants.js | 0 .../scripts/options/distribution/activity.js | 0 .../options/distribution/cost-basis.js | 0 .../scripts/options/distribution/data.js | 0 .../scripts/options/distribution/holdings.js | 0 .../scripts/options/distribution/index.js | 0 .../scripts/options/distribution/prices.js | 0 .../options/distribution/profitability.js | 0 .../scripts/options/distribution/valuation.js | 0 .../scripts/options/full.js | 0 .../scripts/options/investing.js | 0 .../scripts/options/market.js | 0 .../scripts/options/mining.js | 0 .../scripts/options/network.js | 0 .../scripts/options/partial.js | 0 .../scripts/options/series.js | 0 .../scripts/options/shared.js | 0 .../scripts/options/types.js | 0 .../scripts/options/unused.js | 0 .../scripts/panes/chart.js | 0 .../scripts/panes/search.js | 0 .../scripts/panes/share.js | 0 .../scripts/utils/array.js | 0 .../scripts/utils/chart/capture.js | 0 .../scripts/utils/chart/index.js | 0 .../scripts/utils/chart/legend.js | 0 .../scripts/utils/client.js | 0 .../scripts/utils/colors.js | 0 {website => website_bkp}/scripts/utils/dom.js | 0 .../scripts/utils/elements.js | 0 {website => website_bkp}/scripts/utils/env.js | 0 .../scripts/utils/format.js | 0 .../scripts/utils/persisted.js | 0 .../scripts/utils/price.js | 0 .../scripts/utils/serde.js | 0 .../scripts/utils/storage.js | 0 .../scripts/utils/theme.js | 0 .../scripts/utils/time.js | 0 .../scripts/utils/timing.js | 0 .../scripts/utils/units.js | 0 {website => website_bkp}/scripts/utils/url.js | 0 website_bkp/service-worker.js | 102 + .../src/explorer/chain/cube/index.js | 0 .../src/explorer/chain/cube/style.css | 0 .../src/explorer/chain/index.js | 0 .../src/explorer/chain/style.css | 0 .../src/heatmap/controls/dates.js | 0 .../src/heatmap/controls/index.js | 0 .../src/heatmap/controls/shared.js | 0 .../src/heatmap/controls/y.js | 0 .../src/heatmap/format.js | 0 {website => website_bkp}/src/heatmap/grid.js | 0 {website => website_bkp}/src/heatmap/index.js | 0 .../src/heatmap/loader.js | 0 {website => website_bkp}/src/heatmap/lut.js | 0 .../src/heatmap/oracle.js | 0 .../src/heatmap/renderer.js | 0 .../src/heatmap/style.css | 0 {website => website_bkp}/src/heatmap/time.js | 0 .../src/heatmap/tooltip/index.js | 0 .../src/heatmap/tooltip/view.js | 0 {website => website_bkp}/src/heatmap/types.js | 0 {website => website_bkp}/src/heatmap/urpd.js | 0 {website => website_bkp}/styles/chart.css | 0 .../styles/components.css | 0 {website => website_bkp}/styles/elements.css | 0 website_bkp/styles/fonts.css | 42 + {website => website_bkp}/styles/main.css | 0 {website => website_bkp}/styles/nav.css | 0 .../styles/panes/chart.css | 0 .../styles/panes/explorer.css | 0 website_bkp/styles/reset.css | 51 + {website => website_bkp}/styles/search.css | 0 website_bkp/styles/variables.css | 60 + website_bkp/tsconfig.json | 15 + 209 files changed, 23945 insertions(+), 176 deletions(-) rename website/{assets/favicon => }/apple-touch-icon.png (100%) rename website/assets/{favicon => }/web-app-manifest-192x192.png (100%) rename website/assets/{favicon => }/web-app-manifest-512x512.png (100%) create mode 100644 website/cube/index.js create mode 100644 website/cube/style.css rename website/{scripts => }/entry.js (100%) rename website/{assets/favicon => }/favicon-96x96.png (100%) rename website/{assets/favicon => }/favicon.ico (100%) rename website/{assets/favicon => }/favicon.svg (100%) create mode 100644 website/header/index.js create mode 100644 website/header/style.css create mode 100644 website/main.js delete mode 120000 website/scripts/modules create mode 100644 website_bkp/.gitignore create mode 100644 website_bkp/.well-known/ai-plugin.json create mode 100644 website_bkp/AGENTS.md create mode 100644 website_bkp/assets/favicon/apple-touch-icon.png create mode 100644 website_bkp/assets/favicon/favicon-96x96.png create mode 100644 website_bkp/assets/favicon/favicon.ico create mode 100644 website_bkp/assets/favicon/favicon.svg rename {website => website_bkp}/assets/favicon/site.webmanifest (100%) create mode 100644 website_bkp/assets/favicon/web-app-manifest-192x192.png create mode 100644 website_bkp/assets/favicon/web-app-manifest-512x512.png create mode 100644 website_bkp/assets/fonts/InstrumentSerif-Italic.woff2 create mode 100644 website_bkp/assets/fonts/InstrumentSerif-Regular.woff2 create mode 100644 website_bkp/assets/fonts/Lilex-Italic[wght]-v2_620.woff2.woff2 create mode 100644 website_bkp/assets/fonts/Lilex[wght]-v2_620.woff2 create mode 100644 website_bkp/assets/logo/.gitignore create mode 100644 website_bkp/assets/logo/demo-svg.html create mode 100644 website_bkp/assets/logo/demo.html create mode 100644 website_bkp/assets/logo/logo-dark.svg create mode 100644 website_bkp/assets/logo/logo-light.svg create mode 100644 website_bkp/assets/logo/logo-orange.svg create mode 100644 website_bkp/assets/logo/logo.svg create mode 100755 website_bkp/assets/pools.sh create mode 100644 website_bkp/assets/pools/1thash.svg create mode 100644 website_bkp/assets/pools/antpool.svg create mode 100644 website_bkp/assets/pools/arkpool.svg create mode 100644 website_bkp/assets/pools/binancepool.svg create mode 100644 website_bkp/assets/pools/bitcoincom.svg create mode 100644 website_bkp/assets/pools/bitfufupool.svg create mode 100644 website_bkp/assets/pools/bitfury.svg create mode 100644 website_bkp/assets/pools/braiinspool.svg create mode 100644 website_bkp/assets/pools/braiinssolo.svg create mode 100644 website_bkp/assets/pools/btccom.svg create mode 100644 website_bkp/assets/pools/btclab.svg create mode 100644 website_bkp/assets/pools/btctop.svg create mode 100644 website_bkp/assets/pools/default.light.svg create mode 100644 website_bkp/assets/pools/default.svg create mode 100644 website_bkp/assets/pools/emcdpool.svg create mode 100644 website_bkp/assets/pools/est3lar.svg create mode 100644 website_bkp/assets/pools/f2pool.svg create mode 100644 website_bkp/assets/pools/foundryusa.light.svg create mode 100644 website_bkp/assets/pools/foundryusa.svg create mode 100644 website_bkp/assets/pools/gdpool.svg create mode 100644 website_bkp/assets/pools/huobipool.svg create mode 100644 website_bkp/assets/pools/innopolistech.svg create mode 100644 website_bkp/assets/pools/kucoinpool.svg create mode 100644 website_bkp/assets/pools/luxor.svg create mode 100644 website_bkp/assets/pools/marapool.svg create mode 100644 website_bkp/assets/pools/maxipool.svg create mode 100644 website_bkp/assets/pools/minerium.svg create mode 100644 website_bkp/assets/pools/miningsquared.svg create mode 100644 website_bkp/assets/pools/mononaut.svg create mode 100644 website_bkp/assets/pools/neopool.svg create mode 100644 website_bkp/assets/pools/nicehash.svg create mode 100644 website_bkp/assets/pools/ocean.svg create mode 100644 website_bkp/assets/pools/okexpool.svg create mode 100644 website_bkp/assets/pools/okkong.svg create mode 100644 website_bkp/assets/pools/parasite.svg create mode 100644 website_bkp/assets/pools/pegapool.svg create mode 100644 website_bkp/assets/pools/phoenix.svg create mode 100644 website_bkp/assets/pools/poolin.svg create mode 100644 website_bkp/assets/pools/publicpool.svg create mode 100644 website_bkp/assets/pools/rawpool.svg create mode 100644 website_bkp/assets/pools/sbicrypto.svg create mode 100644 website_bkp/assets/pools/secpool.svg create mode 100644 website_bkp/assets/pools/sigmapoolcom.svg create mode 100644 website_bkp/assets/pools/slushpool.svg create mode 100644 website_bkp/assets/pools/solopoolcom.svg create mode 100644 website_bkp/assets/pools/spiderpool.svg create mode 100644 website_bkp/assets/pools/terrapool.svg create mode 100644 website_bkp/assets/pools/titan.svg create mode 100644 website_bkp/assets/pools/ultimuspool.light.svg create mode 100644 website_bkp/assets/pools/ultimuspool.svg create mode 100644 website_bkp/assets/pools/unknown.light.svg create mode 100644 website_bkp/assets/pools/unknown.svg create mode 100644 website_bkp/assets/pools/viabtc.svg create mode 100644 website_bkp/assets/pools/wayicn.svg create mode 100644 website_bkp/assets/pools/whitepool.light.svg create mode 100644 website_bkp/assets/pools/whitepool.svg create mode 100644 website_bkp/assets/pools/wiz.svg create mode 100644 website_bkp/index.html create mode 100644 website_bkp/jsconfig.json create mode 100644 website_bkp/llms-full.txt create mode 100644 website_bkp/llms.txt create mode 100644 website_bkp/manifest.webmanifest create mode 100644 website_bkp/robots.txt rename {website => website_bkp}/scripts/_types.js (100%) create mode 100644 website_bkp/scripts/entry.js rename {website => website_bkp}/scripts/explorer/address.js (100%) rename {website => website_bkp}/scripts/explorer/block.js (100%) rename {website => website_bkp}/scripts/explorer/chain.js (100%) rename {website => website_bkp}/scripts/explorer/cube.js (100%) rename {website => website_bkp}/scripts/explorer/index.js (100%) rename {website => website_bkp}/scripts/explorer/mempool.js (100%) rename {website => website_bkp}/scripts/explorer/render.js (100%) rename {website => website_bkp}/scripts/explorer/tx.js (100%) rename {website => website_bkp}/scripts/main.js (100%) create mode 100644 website_bkp/scripts/modules/.gitignore create mode 100644 website_bkp/scripts/modules/brk-client/.gitignore create mode 100644 website_bkp/scripts/modules/brk-client/index.js create mode 100644 website_bkp/scripts/modules/brk-client/jsconfig.json create mode 100644 website_bkp/scripts/modules/brk-client/package.json create mode 100644 website_bkp/scripts/modules/brk-client/tests/basic.js create mode 100644 website_bkp/scripts/modules/brk-client/tests/consistency.js create mode 100644 website_bkp/scripts/modules/brk-client/tests/metric_data.js create mode 100644 website_bkp/scripts/modules/brk-client/tests/tree.js create mode 100644 website_bkp/scripts/modules/brk-client/tsconfig.json create mode 100644 website_bkp/scripts/modules/lean-qr/.gitignore create mode 100644 website_bkp/scripts/modules/lean-qr/2.7.1/index.d.ts create mode 100644 website_bkp/scripts/modules/lean-qr/2.7.1/index.mjs create mode 100644 website_bkp/scripts/modules/lightweight-charts/.gitignore create mode 100644 website_bkp/scripts/modules/lightweight-charts/5.2.0/dist/lightweight-charts.standalone.production.mjs create mode 100644 website_bkp/scripts/modules/lightweight-charts/5.2.0/dist/typings.d.ts create mode 100644 website_bkp/scripts/modules/quickmatch-js/0.5.0/src/index.js create mode 100644 website_bkp/scripts/modules/tsconfig.json create mode 100755 website_bkp/scripts/modules/unpkg.sh rename {website => website_bkp}/scripts/options/cointime.js (100%) rename {website => website_bkp}/scripts/options/constants.js (100%) rename {website => website_bkp}/scripts/options/distribution/activity.js (100%) rename {website => website_bkp}/scripts/options/distribution/cost-basis.js (100%) rename {website => website_bkp}/scripts/options/distribution/data.js (100%) rename {website => website_bkp}/scripts/options/distribution/holdings.js (100%) rename {website => website_bkp}/scripts/options/distribution/index.js (100%) rename {website => website_bkp}/scripts/options/distribution/prices.js (100%) rename {website => website_bkp}/scripts/options/distribution/profitability.js (100%) rename {website => website_bkp}/scripts/options/distribution/valuation.js (100%) rename {website => website_bkp}/scripts/options/full.js (100%) rename {website => website_bkp}/scripts/options/investing.js (100%) rename {website => website_bkp}/scripts/options/market.js (100%) rename {website => website_bkp}/scripts/options/mining.js (100%) rename {website => website_bkp}/scripts/options/network.js (100%) rename {website => website_bkp}/scripts/options/partial.js (100%) rename {website => website_bkp}/scripts/options/series.js (100%) rename {website => website_bkp}/scripts/options/shared.js (100%) rename {website => website_bkp}/scripts/options/types.js (100%) rename {website => website_bkp}/scripts/options/unused.js (100%) rename {website => website_bkp}/scripts/panes/chart.js (100%) rename {website => website_bkp}/scripts/panes/search.js (100%) rename {website => website_bkp}/scripts/panes/share.js (100%) rename {website => website_bkp}/scripts/utils/array.js (100%) rename {website => website_bkp}/scripts/utils/chart/capture.js (100%) rename {website => website_bkp}/scripts/utils/chart/index.js (100%) rename {website => website_bkp}/scripts/utils/chart/legend.js (100%) rename {website => website_bkp}/scripts/utils/client.js (100%) rename {website => website_bkp}/scripts/utils/colors.js (100%) rename {website => website_bkp}/scripts/utils/dom.js (100%) rename {website => website_bkp}/scripts/utils/elements.js (100%) rename {website => website_bkp}/scripts/utils/env.js (100%) rename {website => website_bkp}/scripts/utils/format.js (100%) rename {website => website_bkp}/scripts/utils/persisted.js (100%) rename {website => website_bkp}/scripts/utils/price.js (100%) rename {website => website_bkp}/scripts/utils/serde.js (100%) rename {website => website_bkp}/scripts/utils/storage.js (100%) rename {website => website_bkp}/scripts/utils/theme.js (100%) rename {website => website_bkp}/scripts/utils/time.js (100%) rename {website => website_bkp}/scripts/utils/timing.js (100%) rename {website => website_bkp}/scripts/utils/units.js (100%) rename {website => website_bkp}/scripts/utils/url.js (100%) create mode 100644 website_bkp/service-worker.js rename {website => website_bkp}/src/explorer/chain/cube/index.js (100%) rename {website => website_bkp}/src/explorer/chain/cube/style.css (100%) rename {website => website_bkp}/src/explorer/chain/index.js (100%) rename {website => website_bkp}/src/explorer/chain/style.css (100%) rename {website => website_bkp}/src/heatmap/controls/dates.js (100%) rename {website => website_bkp}/src/heatmap/controls/index.js (100%) rename {website => website_bkp}/src/heatmap/controls/shared.js (100%) rename {website => website_bkp}/src/heatmap/controls/y.js (100%) rename {website => website_bkp}/src/heatmap/format.js (100%) rename {website => website_bkp}/src/heatmap/grid.js (100%) rename {website => website_bkp}/src/heatmap/index.js (100%) rename {website => website_bkp}/src/heatmap/loader.js (100%) rename {website => website_bkp}/src/heatmap/lut.js (100%) rename {website => website_bkp}/src/heatmap/oracle.js (100%) rename {website => website_bkp}/src/heatmap/renderer.js (100%) rename {website => website_bkp}/src/heatmap/style.css (100%) rename {website => website_bkp}/src/heatmap/time.js (100%) rename {website => website_bkp}/src/heatmap/tooltip/index.js (100%) rename {website => website_bkp}/src/heatmap/tooltip/view.js (100%) rename {website => website_bkp}/src/heatmap/types.js (100%) rename {website => website_bkp}/src/heatmap/urpd.js (100%) rename {website => website_bkp}/styles/chart.css (100%) rename {website => website_bkp}/styles/components.css (100%) rename {website => website_bkp}/styles/elements.css (100%) create mode 100644 website_bkp/styles/fonts.css rename {website => website_bkp}/styles/main.css (100%) rename {website => website_bkp}/styles/nav.css (100%) rename {website => website_bkp}/styles/panes/chart.css (100%) rename {website => website_bkp}/styles/panes/explorer.css (100%) create mode 100644 website_bkp/styles/reset.css rename {website => website_bkp}/styles/search.css (100%) create mode 100644 website_bkp/styles/variables.css create mode 100644 website_bkp/tsconfig.json diff --git a/website/AGENTS.md b/website/AGENTS.md index 49f27bc96..096e60254 100644 --- a/website/AGENTS.md +++ b/website/AGENTS.md @@ -1,3 +1,7 @@ +# Rule + +before editing a file, always explain why that code, why it's the most optimal one and wait for my feedback + # Types To check types run: diff --git a/website/assets/favicon/apple-touch-icon.png b/website/apple-touch-icon.png similarity index 100% rename from website/assets/favicon/apple-touch-icon.png rename to website/apple-touch-icon.png diff --git a/website/assets/favicon/web-app-manifest-192x192.png b/website/assets/web-app-manifest-192x192.png similarity index 100% rename from website/assets/favicon/web-app-manifest-192x192.png rename to website/assets/web-app-manifest-192x192.png diff --git a/website/assets/favicon/web-app-manifest-512x512.png b/website/assets/web-app-manifest-512x512.png similarity index 100% rename from website/assets/favicon/web-app-manifest-512x512.png rename to website/assets/web-app-manifest-512x512.png diff --git a/website/cube/index.js b/website/cube/index.js new file mode 100644 index 000000000..55116b10b --- /dev/null +++ b/website/cube/index.js @@ -0,0 +1,33 @@ +/** + * @param {{ fill?: number }} [options] + */ +export function createCube({ fill = 0.5 } = {}) { + const cube = document.createElement("span"); + cube.className = "cube"; + cube.setAttribute("aria-hidden", "true"); + cube.style.setProperty("--fill", String(fill)); + + /** @param {...string} names */ + const face = (...names) => { + const element = document.createElement("span"); + element.className = `face ${names.join(" ")}`; + return element; + }; + + cube.append( + face("glass", "bottom"), + face("glass", "rear-right"), + face("glass", "rear-left"), + face("liquid", "bottom"), + face("liquid", "rear-right"), + face("liquid", "rear-left"), + face("liquid", "right"), + face("liquid", "left"), + face("liquid", "top"), + face("glass", "right"), + face("glass", "left"), + face("glass", "top"), + ); + + return cube; +} diff --git a/website/cube/style.css b/website/cube/style.css new file mode 100644 index 000000000..edd9acd89 --- /dev/null +++ b/website/cube/style.css @@ -0,0 +1,132 @@ +.cube { + --size: 1rem; + --iso-scale: calc(sqrt(3) / 2); + --empty-alpha: 0.4; + --step: 0.033; + --width: calc(var(--size) * 2 * var(--iso-scale)); + --height: calc(var(--size) * 2); + --face-base: currentColor; + --face-top: var(--face-base); + --face-right: oklch(from var(--face-base) calc(l - var(--step) * 2) c h); + --face-left: oklch(from var(--face-base) calc(l - var(--step)) c h); + --face-bottom: oklch(from var(--face-base) calc(l - var(--step) * 3) c h); + --is-empty: round(down, calc(1 - var(--fill)), 1); + + display: inline-block; + position: relative; + flex-shrink: 0; + width: var(--width); + height: var(--height); + overflow: visible; + + .face { + position: absolute; + transform-origin: 0 0; + width: var(--size); + height: var(--size); + transform: translateY(50%) var(--orient) + translate( + calc(var(--size) * var(--x)), + calc(var(--size) * var(--y)) + ) + scale(var(--scale-x, 1), var(--scale-y)); + } + + .liquid { + background: var(--face-color); + opacity: calc(1 - var(--is-empty)); + --scale-y: calc(var(--iso-scale) * var(--fill)); + --stack-shift: calc(var(--iso-scale) * (1 - var(--fill))); + } + + .glass { + background: oklch(from var(--face-color) l c h / var(--empty-alpha)); + --scale-y: calc(var(--iso-scale) * (1 - var(--fill))); + --stack-shift: 0; + } + + .top, + .bottom { + --orient: rotate(30deg) skewX(-30deg); + --scale-y: var(--iso-scale); + } + + .right, + .rear-left { + --orient: rotate(-30deg) skewX(-30deg); + } + + .left, + .rear-right { + --orient: rotate(30deg) skewX(30deg); + } + + .top, + .rear-right { + --y: calc(var(--stack-shift) - var(--iso-scale)); + } + + .left, + .rear-left { + --y: var(--stack-shift); + } + + .right { + --y: calc(var(--stack-shift) + var(--iso-scale)); + } + + .bottom { + --y: 0; + } + + .top { + --face-color: var(--face-top); + --x: 0; + } + + .bottom { + --face-color: var(--face-bottom); + --x: 1; + } + + .right { + --face-color: var(--face-right); + --x: 1; + } + + .left { + --face-color: var(--face-left); + --x: 0; + } + + .rear-right { + --face-color: var(--face-left); + --x: 1; + } + + .rear-left { + --face-color: var(--face-top); + --x: 1; + --scale-x: -1; + } + + .liquid.top { + --x: calc(1 - var(--fill)); + } +} + +@keyframes cube-fill { + from { + --fill: 0.01; + } + + to { + --fill: 1; + } +} + +@property --fill { + syntax: ""; + inherits: true; + initial-value: 0; +} diff --git a/website/scripts/entry.js b/website/entry.js similarity index 100% rename from website/scripts/entry.js rename to website/entry.js diff --git a/website/assets/favicon/favicon-96x96.png b/website/favicon-96x96.png similarity index 100% rename from website/assets/favicon/favicon-96x96.png rename to website/favicon-96x96.png diff --git a/website/assets/favicon/favicon.ico b/website/favicon.ico similarity index 100% rename from website/assets/favicon/favicon.ico rename to website/favicon.ico diff --git a/website/assets/favicon/favicon.svg b/website/favicon.svg similarity index 100% rename from website/assets/favicon/favicon.svg rename to website/favicon.svg diff --git a/website/header/index.js b/website/header/index.js new file mode 100644 index 000000000..ed832559f --- /dev/null +++ b/website/header/index.js @@ -0,0 +1,21 @@ +import { createCube } from "../cube/index.js"; + +const header = document.createElement("header"); + +const home = document.createElement("a"); +home.href = "/"; +home.ariaLabel = "bitview home"; +home.append(createCube(), "bitview"); + +const nav = document.createElement("nav"); +nav.setAttribute("aria-label", "Primary"); +nav.innerHTML = ` + +`; + +header.append(home, nav); +document.body.append(header); diff --git a/website/header/style.css b/website/header/style.css new file mode 100644 index 000000000..388998484 --- /dev/null +++ b/website/header/style.css @@ -0,0 +1,74 @@ +body { + > header { + position: fixed; + inset: 1.5rem 2rem auto; + z-index: 10; + display: grid; + grid-template-columns: 1fr auto 1fr; + align-items: start; + font-size: var(--font-size-sm); + line-height: 1; + text-transform: uppercase; + + > a { + justify-self: start; + display: flex; + align-items: center; + gap: 0.625rem; + color: white; + text-decoration: none; + text-transform: lowercase; + + &:hover, + &:active { + color: var(--orange); + } + + .cube { + --size: 1rem; + animation: cube-fill 5s linear infinite alternate; + } + } + + > nav { + grid-column: 2; + justify-self: center; + font-size: var(--font-size-xs); + + ul { + display: flex; + gap: 0.5rem; + margin: 0; + padding: 0; + list-style: none; + } + + a { + display: block; + padding: 0.75rem 1rem; + border-radius: 0.3125rem; + text-decoration: none; + + color: var(--white); + background: var(--dark-gray); + + &:hover { + background: var(--gray); + } + + &:active { + background: var(--orange); + } + + &[aria-current="page"] { + color: var(--black); + background: var(--dark-white); + + &:hover { + background: var(--white); + } + } + } + } + } +} diff --git a/website/index.html b/website/index.html index 8a6b9ce4e..11b24359a 100644 --- a/website/index.html +++ b/website/index.html @@ -3,7 +3,10 @@ bitview - + + + + + + + + - - - - - - - - - - - + - + + - - - - - - - - - - - - + - -
- - - -
-
- -
-
- - - - - - - - - -
-
- - + diff --git a/website/main.js b/website/main.js new file mode 100644 index 000000000..80fa46a87 --- /dev/null +++ b/website/main.js @@ -0,0 +1 @@ +import "./header/index.js"; diff --git a/website/manifest.webmanifest b/website/manifest.webmanifest index e4b2ee912..a51e2790c 100644 --- a/website/manifest.webmanifest +++ b/website/manifest.webmanifest @@ -1,12 +1,8 @@ { "name": "bitview", "short_name": "bitview", - "description": "Bitcoin transparency, amplified", - "categories": [ - "bitcoin", - "on-chain", - "data" - ], + "description": "Explore Bitcoin data from blocks to patterns.", + "categories": ["bitcoin", "on-chain", "data"], "start_url": "/", "scope": "/", "display": "standalone", @@ -16,25 +12,25 @@ "lang": "en", "icons": [ { - "src": "/assets/favicon/web-app-manifest-192x192.png", + "src": "/assets/web-app-manifest-192x192.png", "sizes": "192x192", "type": "image/png", "purpose": "any" }, { - "src": "/assets/favicon/web-app-manifest-192x192.png", + "src": "/assets/web-app-manifest-192x192.png", "sizes": "192x192", "type": "image/png", "purpose": "maskable" }, { - "src": "/assets/favicon/web-app-manifest-512x512.png", + "src": "/assets/web-app-manifest-512x512.png", "sizes": "512x512", "type": "image/png", "purpose": "any" }, { - "src": "/assets/favicon/web-app-manifest-512x512.png", + "src": "/assets/web-app-manifest-512x512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" diff --git a/website/scripts/modules b/website/scripts/modules deleted file mode 120000 index 8b0e85400..000000000 --- a/website/scripts/modules +++ /dev/null @@ -1 +0,0 @@ -../../modules \ No newline at end of file diff --git a/website/styles/fonts.css b/website/styles/fonts.css index 63a1cd5d5..022ed4793 100644 --- a/website/styles/fonts.css +++ b/website/styles/fonts.css @@ -15,6 +15,7 @@ font-display: block; } +/* Preloaded in index.html — keep URL in sync. */ @font-face { font-family: Instrument; src: url("/assets/fonts/InstrumentSerif-Regular.woff2") format("woff2"); @@ -29,6 +30,14 @@ font-display: block; } +:root { + --font-mono: + "Lilex", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, + "Liberation Mono", "Courier New", monospace; + --font-serif: + Instrument, Charter, "Bitstream Charter", "Sitka Text", Cambria, serif; +} + html { font-family: var(--font-mono); } diff --git a/website/styles/variables.css b/website/styles/variables.css index a41fc41cd..0c2ef9f29 100644 --- a/website/styles/variables.css +++ b/website/styles/variables.css @@ -33,12 +33,6 @@ --inv-border-color: light-dark(var(--dark-gray), var(--light-gray)); --off-border-color: light-dark(var(--dark-white), var(--light-black)); - --font-mono: - "Lilex", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, - "Liberation Mono", "Courier New", monospace; - --font-serif: - Instrument, Charter, "Bitstream Charter", "Sitka Text", Cambria, serif; - --font-size-xs: 0.75rem; --line-height-xs: calc(1 / 0.75); --font-size-sm: 0.875rem; @@ -51,10 +45,12 @@ --line-height-xl: calc(1.75 / 1.25); --main-padding: 2rem; - /*@media (max-width: 767px) { - --main-padding: 1.5rem; - }*/ --negative-main-padding: calc(-1 * var(--main-padding)); --font-weight-base: 400; --max-main-width: 70dvw; } + +html, +body { + background: var(--black); +} diff --git a/website_bkp/.gitignore b/website_bkp/.gitignore new file mode 100644 index 000000000..88a3873f0 --- /dev/null +++ b/website_bkp/.gitignore @@ -0,0 +1,6 @@ +*/**/*.md +!scripts/**/_*.js +*_old.js +*dump* +TODO.md +_explorer.js diff --git a/website_bkp/.well-known/ai-plugin.json b/website_bkp/.well-known/ai-plugin.json new file mode 100644 index 000000000..f6d2ced1f --- /dev/null +++ b/website_bkp/.well-known/ai-plugin.json @@ -0,0 +1,15 @@ +{ + "schema_version": "v1", + "name_for_human": "Bitcoin Research Kit", + "name_for_model": "bitcoin_research_kit", + "description_for_human": "Query Bitcoin on-chain analytics: thousands of metrics, block explorer, address index.", + "description_for_model": "Bitcoin on-chain analytics API. Search metrics via /api/metrics/search/{query}, fetch data via /api/metric/{metric}/{index}. No auth required.", + "auth": { "type": "none" }, + "api": { + "type": "openapi", + "url": "https://bitview.space/openapi.json" + }, + "logo_url": "https://bitview.space/assets/favicon/web-app-manifest-512x512.png", + "contact_email": "hello@bitcoinresearchkit.org", + "legal_info_url": "https://github.com/bitcoinresearchkit/brk/blob/main/docs/LICENSE.md" +} diff --git a/website_bkp/AGENTS.md b/website_bkp/AGENTS.md new file mode 100644 index 000000000..49f27bc96 --- /dev/null +++ b/website_bkp/AGENTS.md @@ -0,0 +1,23 @@ +# Types + +To check types run: + +```sh +npx --package typescript tsc --noEmit --pretty false | grep -v "modules/" +``` + +# Code + +ALWAYS + +- fast +- KISS +- DRY +- very well organized +- contained +- colocated +- prefer one concept per file +- prefer more files and folders than big files +- reads like english +- very easy to understand +- very easy to maintain diff --git a/website_bkp/assets/favicon/apple-touch-icon.png b/website_bkp/assets/favicon/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1740fc962ce7bb0a18dbc6e9f4ce54304b6dba66 GIT binary patch literal 5567 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 Zw^C2lJfJ4_oH()oGh?_>&5eKl{Vz%p*C+r0 literal 0 HcmV?d00001 diff --git a/website_bkp/assets/favicon/favicon-96x96.png b/website_bkp/assets/favicon/favicon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..9eaa409b05ab3b39e417a67902269fb8826af9cb GIT binary patch literal 3847 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 literal 0 HcmV?d00001 diff --git a/website_bkp/assets/favicon/favicon.svg b/website_bkp/assets/favicon/favicon.svg new file mode 100644 index 000000000..36d14c301 --- /dev/null +++ b/website_bkp/assets/favicon/favicon.svg @@ -0,0 +1,43 @@ +RealFaviconGeneratorhttps://realfavicongenerator.netbitview + + + + + + + + + + \ No newline at end of file diff --git a/website/assets/favicon/site.webmanifest b/website_bkp/assets/favicon/site.webmanifest similarity index 100% rename from website/assets/favicon/site.webmanifest rename to website_bkp/assets/favicon/site.webmanifest diff --git a/website_bkp/assets/favicon/web-app-manifest-192x192.png b/website_bkp/assets/favicon/web-app-manifest-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..291226c100fbbfb952d0eee83a501eacfacf7b3e GIT binary patch literal 6402 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%0A{-z(qMR(_%=nz)*I(FHc{tfW(=;bN#)9zC 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≫3u*WdzJRYn#Z;Wxs84p zU&Z0Bp=V}yR|P(2O!Yg#KAEUfs45W&2ZZWI5&kgcn?QgwZw;e0BKxiCgI6;l0ZleOSAEe%HFO6k}088vg);$xAe&vblo-q?FLyk@1( z^}&gzH}4)l@l4CSW;{FF8=Svr)cn4fJS-fegcT1z%ApDUN)H@Lc&eu;_W(;C7Ai`N zLj|1AR=Pk0@^J2-Z#sMZI0()dISqy&5M0Rxg&yIYRh6grrLvpl*2QdG2o6qk!hFiMu)`0$pD7DYT~3xpzijuab-MZiraS_lhU z^5t9^dR*1{+-F{G$RkR>J4*ccG7){*RL*{Q&8#Hc%1m-L4!P7>uLCm3akeE|-@WoIk+^c;dn%cdL!&)HnfK>2!)DT`^png}emp>hlhMh(>E$a1 z7UGCHS;xjsgM1gRiU4jRa~l|=v(8rlTsfOtJsry0D1R?g9{ZXUX@c|;!6c8aqO{);mvcp*Lm}!tu|*FQ z9FJ?olryzS9L~NB0rbx9ySN&G?0r)iw@%s8+*BWIGZkg>+BjY2bfBf%5Q%CRUUqsv zK7IHs`F*`1A&J*S*V9=(Yf_zICt0-CTY$eV&syjA8rw4|(}!N0F`F@4#ScqvPWsVpyDARtgk?i~R-bvuLiyF_um zfHn1b2;?F)PiLr<#Z18;QeAdyhdAVEYj<~_9VZ!^PZ}^JSy7wvhdKvC6+faNeD7_v zza79boDSuZjBpg?Y(iM$f45lUyJt>=5IPYk_L`JE7ax4Ms;~R+5jz>2%3eu8Z*BfUELQ8q zQax)#GXJryL_98Io!<`5NErFqSsWdK0OnRh0Dd)N4r3ArK)KZ*fuQ5eI!VFc8KHf? zHG{(wLji{^b9e~?{0UWV*+L-Th%r=ezMhkt2C^`-Kc~le!c&y^aNN7!4n{o;mK-RI|G>%U;-(8?yN<^V?6KPrfQORgjR%-gc_v z@j(jc*Zo2I&8U0kgxQ&YLL7PQO{j(^7kAQOHa)52g!DdqhM>M*zU&!=q~xoFB{$cV z%5;)|`s&T2FcgJT4I0Fey5NN#zXo=;vopV}!ej}*uhNp#ajB}HATY>?J_%?VQqbww zXCK512X5E0e2k`7#P7RwNZk#9V!N7e+9*-GE#I)Y?4|A7){eVte2QIRvluI?Y(84P zY&yZi67Dd<2pOc1Q#-Xve2*j`nRR-6h51ZaD5EPB9sgGUuI3iA$v+kTOr}ke+1tc& zVe)aE=>~i|L7mNVp5q8kjC?RE6@9p<=1qtx^M{9^;Ors9{Lzv)7fg@+lQ$^FH(r{z zY1Tkv+X~}{4x7Ql<`3VzIC@&}^)5)Gd+zMh1J3H6=Ro9>`=e)GeoANl&1xW9ee)A^ z&9et7YPfu{V$HL=7EUJmpI#MTFnM8jf90b`& zX}}ZA@SXJP(e#6?E6a?wgvXJlw9Z0BAHB={@Gt3Lt zs3o|x$dpox@qyQ*IEAoUBD;Sb-2LUu`^Vp7@YJ8wLHH_VB&KHN9)E$(V;dmUEVH=} zEkSrj9ty*FgH%&N<|(c@QZrI^R&JXe%_p+R)Ble#U*`xT&wcyq(Xul#7GQqS>lO z*b{boDmE=KxOrkq5J(rPRJv`wbgPwSH6rKLRxZ^lWd?&3=eN*(z#r=rjX2c{0>`SX z4H{bK*JM7xslxTj^ODieRNypwWCHr}NFqoZcNoq!% z>TKU?ja7MK)pk(spD2YB)f9pS-h@nVg2J1i^QEnxtcLhhp?+)D=Uufv%+!uY&9r9K zl#fH@+y=v-s31>A_K$8gQvKwZPSpaa`3IWjaG}@^c??U+=kcNM{nj$fGhF7tkBc0Od zro$FB?zh`k)SvpnMb>A&`S^VD=~~;}GgZ68pqalcFIh3Ns-I)m;@vE0sQxF)8=!Io z+B|MBlpIg~G@-4TfvEWrHO`82RQ(M#&!Opm)HtY@^F7{1)L-uA?yoiLfZEwnJvGW_ zL**RWJZ><|TIv}8_t(0WkDhb$SegWZ-J|rHg=VV%h4L1tauokjH3w?` zKowiz1yz9Wul3jXtNrEvN`HfYp}&sNm-j7R|33ddS04iNjm`I`eV2wg;#X0>fDug@ z`~{eIo3n2t5JU{^_tod7PWKQF<>%yfWl9+75_f3Ar)W$p-p`8m+Sk#Cq{oDDt*@O{Po%~;{A`F zdjQR8m-+l2Fh!l-R-goL9eq>HqrM4qfff$IQ60@2wx^3%4ynio(?z}?PuIxtbBN&e zEusuI-n8ae%sWJ|S(Ap>w;L!cVOl;--btt8Prx;fvJt_{-U;&0rk;?ejaRZ2Z7nwm zSaq)SrkQ}v-C~<-MzQtXRPUr>!>iF$e+^TuZ5Wf;!3((&UMM9YoBrP|@=(|1#<#i6 zxihD^v)?j-OyC#?hY0URf~0{fO!b49?V26A0)3KM+??KQY&USgNQBRY6ab?WT&&OC z;DFAn$=l26;#L^_{-DfZvQM_jGq;IhGfp78X4|hiAFvYaM9WPK?qcN9p{*>aqnfTh z6qKzItOnbAk^BprN`Ee3bUp0)&HL$v?^U{dzsf7x#UU_fwDZRMI89Kb60~gS{Xfff zxX4E{kelevD{bUvAa{9wX@&Xn-16i;a8F-dV%o(4)v}^Nd{}P%9f`5evm-BHlNjAJPg3RB*|vz) z$6Ml?pF^9zg_o~6_>m#{t@9TA6+DKf`s2(QZ2@WR@SRSR+`ZGx0l5uf|8L|~@BhD> z>Ja@O0n;&*My|2m=Al|d6apdr)%jVUjaiSZ!>WW@ud(YQzccxOO;Dr~NDdu%JhRA3 zZ}1GZX-&Poi2DCAXXIT-pE6Mokgp@J)Rm6LYw&ptgv9&+z`5nUYg7 zKdd*au{HgJQxQgqW3D)z z{dD08`T2<3etIZfpe#(W(z3GEn)zTh&nsp;LvD{m?2cwt*qPeXLY?vW&{4~vy7-Z4 zVsaXu2EphL_Jbl@Rspd-frVigfWxH1Zh|+hZ8I zlSfyJc8){WRQx7x1e$u>QTZ?$qIPw?Bw1a)wcn(->g|SuORrnDwMl|Sw&}M%{e8uP zoYyui>73t|M-bKxO}>$_zkYE+517glmx7Fh%e45)Yv=&Dy& zM7GFsHtN?!NP($5;Q8Is<%}&!Q;9=-UJRHZ^he_m@vVnf^0>!b&ihY~pFVAtv+?lx z+Bbqfil#~ZvvkTGG47m_W?<_0EhE-%2u1|}P2!t2QUeJ`8emG~O7Q7RHfqI-ZWTKO zE2pReX@)T-nppx>3Zbsd2X9rRs~+)UcP;>-Xj&I}tSJw|WQQTMtt>JNk;gB#dRj9^ z9*B@F=kzUsN{<^d{hs&+l!8JmyL&}$qY==KcT6rk%_u$wP!w=|NqF+W&x#XeILVtNRoA%nWhJ%7KGStz-L665x*dbK*|(E?CJXCccvGa-%|)*6 zWjGIr`p5#opK$Na#EG!WP;1(0v#v`0K0H^&;_ByEUG1BzUE>za(=D5-jaE&gx6xY! z_=+}Ro{co2GgA1T&DpFH-k@AQkA6R-k8VsEEB^?9`MAusId7>W9+1gbFfxuL zt;dm9TH0xIxmCuB4`r)_2X|GpX@5CbO5)fDRFPNpxR1LU@dVI=S2FGFj?~3tJGt*` znu=L1)En)lCl{#)G{qE0LAMP#&QZGa10D?L3Ki51eO2~s#|DCL{L+1AG zo2j*$zPH0BiaNN>Y+Q(#sNKTwR_f~{B*@gG_O7;+Swx`lvoVA{Ii#O)4{YBvn93p( zamX}1x*y^Y5 zWzwtqzyt2skpc}+{q*w5`LLRcP3-TZR76HY$Wf{^pFXXXp{u;&!>Fd<({aWmYQI=6 z^aX*a+UuLVcrs694}o5|4Nj?n^BZ<`K?z2_qfBvVCpdHh6q9lx4xVUscZ8+pU`t@f zN$uP9lt%=*j-K{JjdcUd!=6Ab8oY5f3@ouL(sn5ht>-42qpIItN!-?|sz|5ywR;r_ zqsVt`BL(MhGRqg)w+ZFzfO?oDXd zcDFvPWFcVjO>(!28zt2bXr6Lku25hWlFvH{93Ssn@p@$oJK=D92=(#M-Nec1|Ak}D}B>8y{(p2lGOB^h`X-MW<+dj z%Y=5inx@|{(q~5CIV9t0_B8CT%hEZZ#^!DYk(aql`(ErKUph#7(AqmHf|RaU6g3S5-4c2-8M z2qb0kLKrJGNkRxX2U_1_?)U5c&DBgV=F{>BMGF`+at`Ktk+V`vR!$fjCwAs|);zG8 zb^IdIc^c|64xw-9Ho+k5X1Rq(PYpSwiG$Nv9dESm_MA+1pdZycJ4T&l2{S`g2EA!$ z>oSi*3|+t$0X$l`3n$Pxu$6hOR9fZD1I!htih;3yD`n~uNQ+K0O09kf#(guy=l3Wy z>((R&hBL8N&~Kl%^A^2kPPm|2!JvZ?(tNED3R$SqTUstG;&Hzvbzs9HZN=Q}#o#>= z6|Q2U>t6_dN|^N6HkT>PZx|o)>k|aIBJQ>4Q)6i+5)^LpkudaO8K8}pLTnIUh>s-c z3`?|Itg~;UZkRY6F5rHI;tC&!&VZFgp9_oJd8)k2U2oWkdj7WcUU!*_EM!KKu8XTT z0p;Q_H@V#$?nE;qCWaN(EE3|3>lco`B&8hL87B{PkRM55Xqk`$=3u!Wi<>yNwaAzv zrvptRrg2lqx`dke-yQL5FEoqL*Z20yb^6$=V>)8KdtCm4kF1=#F&J1H3{W8*$X4m1 z9LWX%Kf|phkZ(|4$XxQYpUps83eGkC!u_uue)1sU)`|pdc%;iN@XgJ2@y06r6hU6s z(IoSVZmY}e)QYhdfZ#mxrLFTci73(q6fi4CX}6Xg>vYT=sF=)Rn!?T{73b^L!ug#q zQ?L!fm9Mqku`8wA(y^X1L6EieuqsZc6QW7V9)$2V?v=ITs#R3#ds3|g&$d7Q`c~ii;8OMbsma4;WYrPB0g-J zi7G2J?QyoqX}cpnE=;jh(jCr~cL9hfG!`2OPR`1A#Y`QS8a~!}vn^Lodf^6lex|D& z3ToTufJpWtoKh3p87+iS5eP`cv+f^>=&ole4=MH?OOIQi&bAbCEDpT~v8X5qiN`I* zCV>{#Pc$3+OPEPcV^bEHhyyo>!&Rco)#^sKfTB~r(%6d; zrW?J~bfcPbZcGjQ1aGMOMF#^Jf-pPeLl;rT{o6W^eafSNpkkn9GO)m9`4gCD{`n!F z`!lRG+bk7MfrI_3Ktf^}5f_*;&1XGXm2F9rGM2ygjBO{RWR9MGgVxFyoH%nY!)zPtDLhR)0wX*|cbG367+hJx;y|}{MkZ)+sQLPg*?o9Ey`I*0Ziee? zT-Tv%%8W-Wi19=~l#f>KU@qm9K@IlI5$Fryp=k0HEtUn^w!<4IKeS&5=dUe|T(n+jrx z+5ajH$9au44C^*}vHIBM9y$WEO^u$nOVK`2B;4FG#Zk`g)_8;1j%|!@?lk5x%`44% zZ*R726Y0t@*lzujIovhI&rL2&=kzqw(dbFnyVbvjQ0r5b$5wsE{0g_$S3E6c%Qyt% z6+si9-=pkUY5uR2C_`T2alifi?emBA&DCNyoeb~mf6{BCR-6rEYw&J@-a%%U&Oy+6^Woq^0GV?b%I&g-!wI{V`Gm3AHy zbbbAW+1KxqwN)-+j&11)+8j_w8ul&aQTvR$Q6Mb4=ETBYNF9GD{ae?Rxky}ajw_(x zFvOk%+Mw~ES&$&SUhooo9n@G?Im7;JgaHqvNo56DSrgx^VU>{}_hV3`TV$fi{&4Lo z7Wmhd()U!FMPoc7e~2u5RH0S_009;SyK!MH*R27Vmf$H__xl$)A`rRE10q=*0ibs? zqCL9m6x+}Ztkszz844`vh402iu6Ja=`Dn^n9n@L9*VlIMkH&!*1hfUEEeQMwFsL{; z`dX9riTKCD_n|ThK>r()sxDX0I^ko)i~YFT>8mB0rVI%QT*jyLv&xN@FV4MA9HF$- zQ>T%M2#!U)E1^}(3uC#c6h3n<)uI%nuxy|7HGz2P#Pk_P0w6wBebUEH#VJOo(|qa& zmg$@D6R{fh_7OmUc$oRw5bNrMU&^pw9}U6|SOzEpxSH)l$Sp6xkkWrgf%*t2{869t z-DkyoygU2D8Gj4`pCO+LkKiF7P6!fo7!EeOh~?H$DJ zza)y&=mC;bmMlSV+EW9B?$jZeG`t*MN>M|h7S{Z4%&?;w*?9*d)P{dm{O+Ph+Q^_2 zMtx8x3><@u31m@2hymPy3zpt0pKs$3_R8k8_fH+&GF&5S}0@rGW6@T zabO*E15X7l?b8%*x__HN|A(lR9gw-1Y^Hm7-Z6w|{I%wi&RTkjq?FvW*=1g@7G?H@U7$49^5-7Z#0%J&! zjLer|q*0^)6H>Z2Ya6GV1!i-<*ecr!NLyi!i>SFXJ>Oxi^Y8|@76b_zjb7%v z(l&H8zoz)gBu1!FEVzy;H&=55jK3;lU;J5oh)12=&5sUlin9gau5v$tY~IpW=CEd? zAoLp7s<-jhBRFSgW-?=rd~!kG17Ce{`Sz1!oV`=*QCbdv#td&3{nb7M)A&hSG` z1J_1>Xm!)B{5U{%>@GBYdM$AR>`1EuV3xdo(9hn>a|Y4Z81j$XwXK&=FWT;%ke8?+ z^b*5sLwZ3h!5V%BF2UWr+7%yPyzAIs?0EebKY`o(Kzm64?w_4NB+{;gE==qO` zq(;CyJlD&3-g(HmMw-akMmNwn$_swn9DcFy_!^ri}> zJ{x~iT81roh#FiSYt%43LRdRzV2uZ??X!+_M}V9Q{}N6$KD``vug~kdnO=$@1Jy$Y zF!PR3%jQk^m<0Qnzy`ql=w!yZVE1m1MO@!wm8vH_3ldbNIu%dsAIkdp&<^~Enrp$+7!Eb=tD1d87f>HC0R+FUEnSU^}3Abn;y%s-94i|nLHhP*^t7{W9voPsod zRMQAqYYdnKAwGu<8xY{}c=vc9m(GO0J{5pH^TykdBM!_{b*?}f*t4<<=&ix0i%Iqj zGo1~Yo)QR6ahL8aHbuS&_H1G>paW@~lPFv*qbgk(F5FZ)BDBi8&2Q;ZmH-Ah)K|@% z?%pEa2+l#vyOQL*mk7(!%?i9xRcm=E_QK{llIx05JwvSg97L;8UF)kzXvs>wxox}* zd;oMdh_^4veqly}1bC?{IK>p)t}%~cUac-kc?zfmKq}Tz{x3q9wfLt^E~N;V zw8K0}wA@cD7ppupBzUrQ18PVIt>6V^yk~$(V^Nvw2^~phb8l!>5ife;XI#Xl@`#}@I8&c$B>{P6Ji2>|@)(*Jb->*n(&dai+? z!T*xMT|ghS8w29pp0LToGj%(7s5nNw z*YL;t*k?Gzd=R?K$XSAPxMUv@iYI)e_nsxOu;NH|?(;5?*XWc1fy`6-B1K4R+`JngXB{(3NhpwQJk~J7qf}-rxGAxF6yDHM`x}D_SCie2Dj%zgfK(``}IUN4hJ0X=7`i zU`9WcSi-J8o{Ix9rI*jLblap6-n>TO?IZf^(`=rAolOj{l)h_7d|%hCZnu?{T?n38 z?Qsocb2xV%X4dx?JHeUfTU$+rwo8;y(wkqA4xn zq1UJ125)Sb23!XP-oP-t$yFyy8fs3Jst!=^Hycgy5>NQ+4V=R5@0SH4hDJ6aC7TE& z&iu2zjGYXOh6@bf>N9R@oXHWK&K=y!b)3iLx)OEQ=ivA8AKI|D=0go>Y%V`k9iF|+ z;b5y{%VImpwx%;lo|Su;Kp;n(fodKCMkL1);HFa+;1DpmJ%?Rd769Jb3K&0wkXv*Z zRzru2n|1{8>_Sm7?x+U$2Rh6C&w_g|ViGrr#j`%_xH2q`AofGR4{Szff(oQuI_1oa zN|h*3p+Xt6Fg|>kX_PZ6Q^8E^cy?Uhz$>mdAY{H$LBugn|V~Un0X&qIJlAB``nMA3%^Cp+)Xz`e+kgc3-lssgm zRRmVoC`u*QG`vW1McSLMl9nn=3X>2S=Ou?Y3|Kwb5P`I#)x3o>(0lK{R1vc=B*a3I z{j9nowQ_Q7L*^$FA11>uuteec<;|tZZX2&unTcxC0*CCUgde{u!&O^q@~vgcl`_#G zp2q4&3#x^hcb4^~8LDwZC3T%t^%3D!&B$yR!Yn=58wToMeP8SGL}&D$>~b_P(WNki z!v$))BM=2N_E^q?r$74rCn|V(6%ElrM3)6zbU6lGiHTU?ZJ_V55eEiEg29ow>YD3* zx{;Msh7d=?C%O!oJSE{9OST;JIpXK0TMX{xB%c-b+Q;8J0Rj^!R76l>di}~pDZ$B< z6QUyz?kdokrz+KI2o;uAoq7#~i|{5f$MPXEGtcuSfiXYxC{)B$fObk0+bB_zzX2Rr z5XoMj%_TCcFUhws#Y=x0DDY?Y+bD1BBNh4$6hy^RS#d?Ws-#wL_>4?xv(+{@r_7Kg zmKvV#IPB_-$PaQm9eWNO zIT66K04rS1gmxh`anT8ko%6!8jj-FWMo^y36XQMLuhmK9UI!*cQAy` ztL|)v6=fYcXNTz9(rO7kdhER~Z8-jQFk}P1HiKkaV#g^Pg#=@>0%3&;Q~&8mu|qnx zQkbbDNr7Z!nOKalnZXDwMg5oQj>N9I_@z;8%F`j0&VL8i0s=}*VFShF!bYoe!##+v z`p4#bUx#5gn4H`FZmEI)hv%x9ozUnP#^zQU6(3{2Ll_Qk!*Gfk`r~gwaet!9|8L`4M_5mZ! z(lB^B!Ew-r-*nl~o*;!S5G0gRctOI(NEgt1f%~4JW{L>Q- zM($f_{#LJn)-hMl;U4r&u-YT1ho{2FWwz_QFwrzIVt}ffQZC96VY|rdY?Cj3{ks0waUdDazoH*yk z%bV^B;>xx@76|Fz4H)qk5Rm2H|2_5}u z!36af1SR6YhPnU&vxAU=Mw@^Uf=4n#CL+NFQsB5ea?Ck?RDrqdw9u&y@8>s) zQVMD@ByBlms|+huIvG@ag8KU`*2?^B^UEvhE_Id5x|xj9Ac~M#V+kd@sV-TXXSq6D zF7uItf?%lJL)|6l{0f}8=6jQ%&3SeQNJLc9 zadVw4zfmAkBl8OJr+T0q%EB{D$Dn_1Z3YEi0z>O-iE%A%B+Tz0nxcbxaV9`RM z0)KXU*?*yGhKMZf>+pj_V`#_;cNxtaTqyzWDkj;Y}+EH)A__ z<$rbpF(gjQpI^4CFJV$KeP@67(cJqor#qD8K`M4oks`QV!Ge~aAc@te@BQExNXcS( zEwa)^2f&T9kF8eW+?zS{Z8&8ufME0>tDZvnmRk!(v~NYn$AwV(@&8-B+e4$akNo^d z=>B4#CFS6ChWQ-uB@#EO^Q4ES@RTc^PYtXL{U?$==o)bh*u)!xOb0av(mSa?Cz!&N zmgyUJ3yHkM;02M2K}GAUEBop_ylL%w*zJv|M}OtAYqwdu)n6)}Gr=?o%2^1LR9KHl ziRZ!nBE$D+lE=iINJjZRK{pA?HB?wnQG+5;l2m!%;a28jovU{gSonA%6)DbW`qE@` zyFla3f-m1HvBia`9=qy~!}{fw+AATe4}L6UF()ZYE$-6mzG=>-n)1sN+SB9)LR)nIY-(k}j@YE|`#<4w;E@xTDQ2vC*AL8i7n4LV!4fxdI3)3T$IFi!gVFHrg%_)XDG$xR>D>x!>Bo zSev^%4qNtvIvI0dB7hcfxS(x{$T%ciO@80Jm*F<40QH7JEa5tr3okK5&A*~shWdV3CgbIPAIo>t5gLS z&L{w*Q7=6!U&!rt{GHs{d0vQ=zl7W50t|DLFb8)2)&3@q9n`SXh zO`9y{>^;tYM+kC&y!Jv zE%0OP+q?Nf(uShXg7Mn+xWo^!;J*0h^58v_#{EH0*d4|B@NXOiy*KzI9 z<3y?k1S?(XBz+wjToMWF;82+^sF!yZqq2wr*OhvJi#~HwacAa}CHZnYa8UxGC3j{i z&6E3%RfT@KU+;zTF8^!`?q!;38AaG4~y4TBY984tIgw*xtk9uuFrW- z#ovk)#Lgu9Jm1|m21jzMf@aiR9J$N(R^Um9?nk|m%v2fE9(-?w70{dgW!+#g znr8jrLyC(ev~l7c{1MaUv|C#9-f2QEtxVC9FZ-S28L*hJeDmVuQkuIP%g9~hpQriW z_`K%xH6Y$2#OoLT2X1g=#1Z$RRz2+lnn(um*>2gp$hIQ=fraMV;Gu$53r>6U7u1h) zdD#LwJKnY|^}h=ZqQD8iu76QB{vN7{)S+N{Vg?~?$GbYY29}?u^6&cGdZ=1G-)c6V z$}S|cR5%tS*kc+)49=e2d~0*&fm(KJ5uP!-Cmih}_mI2AK49C&cSk@wH!cnJ_Drmv zLd`esDDHu<`3!95wlUYnjk5WQOcVo`?^POe*=>MhRU|$ZOKJ2-HyK3_GNw@?xS{))CN-=&EVs_WL4h z_N3v|3(TcHs@til5jP-z{TvFa}InM;BNOe+C4jLglks`Y9NhWrJHL6rDv;Ec>eZs!&sV zi_o{R$)&#vcUlcX7jAQl;OPCECQ_RO8|->Y`h;obZ+ad@qw3s3Acy*X1P&i);w)4c zDv{_!CRqb?Sj*zf*vrE|IbKc!U!jQ5z;Sd$;XHFYZrwfISqav@>cYiRycs|!;PXb1 zZ24XW5NMkveJm@Eft{CTJUnv~!(}rS3-1KRln#EJ*x6i|&?YagYhc)Czim^t{ij)4 zifY;3CS%$)lr!%y_zloiHe~tq@UMq)Z;ruoB`?B4WU?!r$p*o-SU}f1IumN&#KMmkq&Yr9)Dh z%`R?o7rjYNT8l-taCNY)<762DP=)}=BU(I7XH?o2Q_aiAap6ZLF@lU|-z}g1Ilh+% z?^pe}Tlgu?CV6iKP@jErd1aXK1SU?~UwUSwoZ~{!Y^iIDO!BJjmP6@HplVce7}ZvB zM6NT1_L6bp+n*|NV8&HcME#Oz?Xqb!tCvs<5f*aCe2V*OQUF!|=`w=mip3mnyT@gx zjCc+oUMt;s$3C8^b=Zm{^+Xi$E5ivgK5?Bcja76c`p(-(qK=#Flb#B3kz=-ReEFGN zdGijxd-o-P^DI@bOXlI2=mi)ydt&BgCI*{#BgC{NEowij?6GonBC&4v&Tfme%0*zAd#BbshC{n{L~1! z5y6d%J+VgC`Rm2l%v0+FlbVHYNX2VEYQrgu5)HOgb}$c+oxs*-VP41N-f9k(JLohVd9YOB_U3B>AHc$xU>NK^ zuLfWdiIR-BQrc44eL-wdeCT2RzXxr|DUF@lJCb^&u@at8GoWkLyt-X6t|%kjKPC*V_d_*kBc(tNuz-z`n-J*G-Dyn58Tzep%}kZ zzx*YfjB64CS-!f|xKn?a6>Mu&sZdgULKEWeibV*&C{#Kx-O8~}XE&VSeve&=4<*o- zj)=^MQa=Q5t%uB(SP>b--?4b%24Xo!r|l2oM)l(k!AtDx617LwVdOUhrX!le>z)TQ zh5Ae*_mlCe1X>^FLn?NPO+c`e)=d&h)m~pT<)qnE(sW!$CZn;VmnkX!QTW&X zrKZ~`es_DJ$7RE>_VmQ&NtP zT;Ccu?$-=4vlUjmM>7>sSD_3EbrJoTpER)m8&{EK7YQw%pBaQem1>&7WeHhYwEiE} zLXGI+wFVTBe0WM28JLplNh1TIELLpPV81syt(aeqDxWo%aV|4JWJ;DU z5Xr+Q4xT=NiloUjDb&s4Rf{+=OHe>U22iLF5`;VQ61TZebn-Rp6S&j?<%m7eV@B}OHpLMPV&m)T%4nMkA10}>jA zN~2UM%Z1AeLX6A|LygTXPHn1Ix$Lvg6iYPBC?12&Vn-|+6&f2H9j+iKsd~3Dj%ly4 zXf~B~!HZ6-RT)yd7%MC-E-xe{Cg;rT7sE92GSyC7(7MCDT>#-fgm!N7Cnb1P!ud#c=N>R!Z01jYEI`?VZY`QqOg^nL^s zgU<9I+gc}65bQOK7@%f!?KN=*!v{)&!U9W!^U>t#b6Jt^=F0agxyuZ@b_dR>sv80e zv2QihO2L0)_bchr*}jI(G)1deDxF9r&4$bAcwC{NTCyIwWFlp-pM;Q@s3^a%z_=K> zT)9TP8zMG~)q1{Ct}_l{{SQ*nNX&0cSu9u^TpeB?5aGh8Raw^#H*vG+%vOVWWGVFo zHEYe*CZYec11L3Ac>nTRWb`&KP+wcKHIr$u9kqMT|4-(-9V}%!W3;E}w!0m!$ zR~y_~xqV~hl*@W3+Fl;*OR*nyYwH^}mmn(f?c{POu{l1Z<>7rI%3Uf&9VsHEL@)qD zhQ)y#28r#QjJFQTKtir3jWe-UW_E&+RTEmhKHWY}Xde!iG3@$%zCS29f+06Au!H?OLhO@$ zWXzy-`&~^ZgN%fPl&FboS6Y|Z9$K>8(L%?Wn_)A!>AKOXKJ71{ zZ_)^%{yrkYf_y^*_Z$p*77e>C&mm`EkHZ@GosYdD1^$nND*LVjzK8uuhVN*gz#uT| zpU8@T`I7-bfr#WYdO(R6&SBCbC=e!%p;E`Z#6_s-K^{*wOh`J5n;FwTaK9w3RLrHYo)6V#Pf=hz}Yn2gr_@*j)y z%ZnV0tjz5D4vn7wF&{U_sYgd=dy9{^yUX`o_i(umo)nd=hfF!shi-<=uUB8~Uo1~e zO&Ob+#T{}20a5-#U<%4ZG@~%n1NQ_2AgffK!d$Ct`4PFB=lbuN(B3dCki*l12477h zKu6L`Y6+-&Xo8}^_Js;WKdjPFULuck__Et7O5N+=58>I&OL&0l-Y6kBDjY5dG7L5Z zyFmBdqr?g_HD`0O>cH3}6 zsgx?%v~qR~K6Q4f`FLxy`>-%HS``ZusQ$-t&e<%MiZ!FvZ8u!cmO>-{OFT`eFNPqf zu(-g<(AcJp$d`rw5m(iDYG7id$By67HxV!ZT!J7yk2T@X21NLeQE#s zWd&nQ5vmN+{9lRxm#y{<4UF^;5B}Q(=4PGn@EHm|xER?^vsAIciT|+90-gUM#0?^N z{{#zh*_cTU>ZvD_y{)gBl0&0sQp&U_hk06nP(bJYy-KIHZTCrZ8kQeEz0%Zt)mM$j zc85y8nB@h*Z4vv!;Kqw#w8S#5+Zfp2L9fQT@AC`mGNDIexBF(r{VB&c{1wHYlz@s25J?RXeDI;2kUJR zCBHJG6edI0MiyDfsIn?FD#~y&A2lQzJ3ig10BzRzAL3M!rGAq6k}v>j#sW+#uNU z?+=JV4qnw-(pDyjKm-*L<^C>7#<6A3Y=UIe@>YLM;h84>EZ7Be69HlYEMr!f0&9j{ zntdyBCU2f&cZZHCreo(}=!(hT(cl?HWnc#5SKr5n*&FC>fHk5f&fy>3XKT1P!`$e| z`X8D;uU^7FDxk;SE$~NCAWR^6i)f%Xsf(ANH4&y?YY*sFtc}a;8)oUg2qQ|rkx|Iy zGKo~4L0~F$nzQoTlioF8Uf#bG{najy2}kp0{8F_iG%&|yG_4krA}^0R&sCy3{VhPx z#w9Y))U~anb)Px+ESfgbQ%J?KVl zo)IC(l&texm}D%9MRLxiS3Bm5avwYLeCV2_FrPhQ5P=%!L}fE8oM1{TUe{$|HznG* zM`x)tiBiW&(p~;0r%}kCuZ_z@Y1hN3ks8_oe840r880~<_XpE^0R@F6(&~En~TEKD|Xxy~Km4ppGL+MBqyul{7eXd+qsanI$Rw)HvsTxXNF8%~}FX-wJwNe+`sxcld~APy0YAHq9UQ+8Wceg` z=W#XuM-^qAWd#`z$@Xsxkf8$^u*(S~8B+wBHZo+Eiut$RKKB$dQ5)?8UiybG0cx$R zP$rTw1-mN7qPi9x#HicD5V6SS(7@CO$`;Ko(ZPm|@{^G;>8r0TtdwF{1d)fL!mJY? zv&9(3az3!XcBM@b9$93!RJ_-!_Cf8ToIdALagB1@YenOX$(?2XYx!6{2|I40da`pa zsf=>LZm>hZW8*7vB);1ew0RPR0{(H4P_qq^kvtZ~&=$%d==KP(NbZQkhhvxYIG8u2 zMr}%^oGPYg3l8DO29g{R6AqXRnTaMNOU$>r}8WLqO?nz>$Jkg2%gGw@QP|pQC z?+_&Chq4Vw*zJp!QZEYHY zjAeaw-&$H!43iGjr+$yocpsOg0={Z6qt-5L^(F$+Kv)Y^q1wn65g~;^5gwRX;Xc&oU0Qa!>R*sf=^|#pMl^?L3HhOkEu*DCI;+C@C#wv zf!h7AzM5OHm%7%ueh@^s=-rXaALemjm3&GpW>DAzb3(V|W9mmYxu1M{%5|T@oGbEy zfwcI@ntZ4Yo)#uA5eb7NcJYEn`U%`W-3Q=k`>xW7von-NVnVOwSlUbg{yYPDRNT<` zZ4*bo5TPvlQAbB775oXAH%bAt{26u>Fzsz_gET8_cP(Zjx*I=r2%a(@b`q$v!%Uay`xtj(es<$31 z21vO*O-qO2p|(&mf0Bd%&V3T!vgJDR6cTt9jSak0EVQ|PWU2GL6w_&w*pe!hxf?=a z#tV!7Ro|J)?BB9KA1&m>pShWbajdJk$XabYG9r_N%swnCzusaKL>p7DvWZTg7Y72k z(F)?E!BVUBlusya9Rvih#`WG+N?J)CBu!fJT%Fhbpc8qQl>S0qOh~1Ma^-Z0W(6Bq zgpe8=r^<0+n;FulC-S3%r-m~B9rYwh`P19fK)Q4b1u8BZKu--D8Ig$ZD-QCTnx*fM z`+M%B(D)I|1xD>KU&NA_1(53X?IAW@2!?S6svg0DSveRJMjsa~FY$LrZV)L@X2?>*18C+kd(7S*ikjfht_)wqbWZb>&eb?Rx9bNQcdJKH?uLfg(Xv*glwuzNbz`8Z%DR+rfnxI_e zoRDxySrCbx(>GwdZtXIIO^)^HFp085N#%v^qZK93xMLV4*K!C$LzYNY>{p}N)R#SFltj$EIlrX8 zC=~w!L81O!0nh0HW#j=T0egKxVBSgrmGMaKKtcF}!^Lrsy`zGt>i;p<5dnjCo{055 z6>H+Oy_-+Ce4?+BQupdGi>E#sxQSL~gkH}N88h8(ZispxkJD33UldM+|y z-!Nk=0TC+|ETmZ@&I6F3yr7lWfT{qHHVv7sSVbg<>?Kd7z<@j@S^azGk9SYKhHaZo1SeHvmG! zmg4xuEZVd~2?M{;MM0zaT}&egfuxG)1aq&wwbV?kWs=G_8!i5bCW{kOpzw803qu&q zahmPt#jwL$>NRMt7Gvp^Y;&z+*gBvjU@)fpPG%KmRWg7c!?YQ5EZ?Q1*U>=O6j531 z_NUpkut3zJh~!VKGiJZi@O8IdEH4^kXh1Pl>&Hdwyl@Ih20BGv5wb8ZO-J1B$gQ|| z)#W)T*({4gI)u|%wiu*iZG(n&d|;iC9%+a91BJx zQq#ZTRK{r!8;GA(2!k3d+Yz@t6j?QBJU>#Olws{$5&Nk5W;Ow^rs$4RO+`^kzm=@u zA*>-n9_*ltE``wiO&CvH|5=aV*kCj-dawEo;-QxTf8BS@N z%gd-y2-hq_V)4aYto+zAkz2^WpkJnmJ|Q|(6*nzNH!dH`e1@YYL_eaaS% z-Kx}?Dy{_0X1Cpf7Msf@huDFu7y-OFg&I=~@!R9eBn>FaP@K8ktZo2cb;G$2J!rhK zbE0GK>O2rkV$zl_GsCjMNR5a3DV!TO7`(mrmSXBFH28qLiW6fRY1FxUV?wSA5gedj z;A_G^ggKUz2?66=Sa3WBNfUPC;jVX02<`5(s#TA(R*UR?m0e@H-Y+Yy)xNH=LWF=DY%XJ7(U*M z8!ly=A5)t1v}OqZF!eMk63153i%G$||N5j{04i15)hb%KM@E(v|&SRs* zcsh{<4$9#pK7HeayLt?x|K!|F_LnA^AeJ~V4 z`B~1&eq_P#K_|LUw4|Y)jJ4Jad4Q18B zFKi$Vuf6L#=bPzLBTajn?GL*PQb-ogC$`STOX%ZIo$a_hb010D!>p54L;KjC z%V7)dP;_twt(|txp2KO?yii?@;HAu&P|5QRD-HxW{kkJhBb1FtS1AW%9T%Be#~Db7 zeC^}F!26VbCup>|bu8Z)+P>oKf(Znz7kfkj%B?>c`fJZe$j+ey*_^Mo{HlaQlquA3 z8%AXgUcP)37IwUvRD)w2mq)*PTdZ5Sf`f;}htEw-^I{)-5YNBZ^{S1~Ogtw4QbR0; za3+?IjXV{#P+GOhq7x5tkA)^D0-+|ru9CY{IK**EhJ|1#-fK5DI!H#lX*hx2b9%PA z#5KLEF0eRG;1Nj>|2vRd%jVD*mwP8YWZNV;bmeRGeUr=rT2A3eVymCRG#Txh$(|3k# zw}mQw;oNZ~dthdU2Ac3OXs<i4O$L1IBl zc5_&xcaiiKYemo^JYil8tuOYx9Oxi{zoy{01QefvWNle3RJCL2ZY5@bdj2T~@xhUg z|NT^PS6@asSy?#EDdePHaDL(8=t?Q4%8@2`T-}IePUC`>`W(Hn0SC7E>Z| znU$67vS9-U#elRn#^ZPgeQAyvlyk-m@5%;^1AA8{Br$LPWI zXoJn(-C^tuV#tJJ^z-%!TFXN|CSU-O`s-L@3*jfdArJD<(H!>Q=kKsV6GJj!6MN}0 zR1;gMT6fikt3-!UjG5*H)&`p?78$0U_=V`ic+Fs-PW`LBLpq)?Py#`j`Ndnc`SdGLu9qRWtVY?rNK)Dly3srpPd?JSawQ}SS z@!aK0VqAfM=2^JEVg&|ev{I*{n}TyU+|*(6{U~Lr_>?EV>dE{=&{| zV$Dd(J~Il$g>n}A8muF+s%ZISan}MaMy*xE%QisCjkB-lbW^P$Qd&Vf%tBpZhazI; ze`{9R&L;x&N5aEBxA!cj@$jus+;0Q3ZBKBWA$%g!ae|j**5V*g_0Nfm7a10nR|I#>^Hr#Y$AWPUf zG`C-|#I6TRLo@!QK4j93YDY^~mIY*F!LfH(BOB5ySasayHpU(7WZ;hG069qhlF%V9 zq-JJMBpbpB9i|-a;OO69ARL45F+P>{fT0kMR7|$ntxVifH{7m49}Q8O4TmP+L0rlW zGCs{>vZU{Kl-XjaylkU4H45Z)#MpDBrC^|FJ%WGCJcdx4MHNezh#p8Mw0+WXTh2M& zH~rUKv2FKvLD@B@FJtnKkeK$%>0=iwH0M;(6j+e77X^;lr;fFUeKk8t2;zu0AXzsR z))om(-}kBI;G48(w;1dK+fjh@46=b>D}Z7^?gO@`dpzUyY%=FAC*>*c^ZEp!_44F$ zM}%{DJ*zvv6~vB;JLl#{foqYSZz`T^W$48MYSM_#3~kW^>0CaN210#F04Sz9GWS1K zjpDh`WaA-^@yybItIOE+e~}aazKTm)o<#io-AfzPkbE~AIf3K!R~Je_2au{CxiYX+ z@88r$Zn>wrZOj_UD)UGDY?BZ)+G__Ve~w`$*AY8htO5I)Q{!eEY9lo0L&7dB=BY}8 z;w`5I{%?w=mb!}lVt6(WxEhS)EC!6(r*~6HxQ+H;hpx>_+dIaM15ie$S$+g}6*MG{ zB_F*eo^bY+r;xN4N2=ut1ckZTP}|F}Pi4wA9qm+jxg&L7LR%V5n|-DLF; zPM_%WbI<@XpgG5vZ{@M(^tIS}QK*ieB?Eii)$#NA=o@p}OUvO9g&PsToi1uvk(pwi zMprFsJy${I?$6cn9VS3L@)u-eI`C+xK`wmTXIl)}z}{CGi(7+oi~osT8`QwiIvlqj zWMsr2Si;uLT=I{s2N1ERN;%Nyf4!rQ2e;rKQ5}9^2x9t?POe^gxqEyS!ivZq0W;;~ z1AD_>FLW_+h4v(AJ!{s!t_+M&$zJMG(sz86QJ|2rPasjEfX?GujhA^35rU+uPi$A| z1hhb_?Z+vII=bevRmu=vd2zrpx?oUxWK52`FCQH7kRNaY zN5xiyvvj!k$74gn<5TtgT8<9_dS=mN^}B6nnVG+0kMav<=V7$~;^2_6C>Sn&yzEHC z?O%Jd*mWDi*Y=k7YlAvP7gRC*r_5U0%2JP*iRe@Vc+VY&t+hN&v=o>mif4)j z+NdxZdUb%1xO_&R+#i>j!kI6c9ey>Qcn5=XKTL7NLPi&&j)EuK2FuXh`Ag9oOkTCz zB@nIoO&#&6CZQoUVq~9*#H>{Bx2I=IKYatOQmtu}pSmHiyzX(KeLdc3n33*5t?dBq zz%uFmCUA@-|A^K|MxXBiX*5~3VZI6sR)3Dx?vE1Oq3O3qQp1j(FW$%^v(cPLILmM1 zWSdt#n`tohUK0kvjZib0_W;Zm=_5hx&6sU$G&|Go2T=K~@Xjfk$O2Z@$AzgbuL-(; zKmJf5a;C~U1qgR+y7HslyFhdMl^yxQTV?Y2`4>2Kh)h;O1+eeh)M3z0j3Yg6;@rz= z*$$=515!Np#ju``9t6I(_&%PGub)2#I`wt;`Ki1@RQUSqHGb7%6@zaB6F~MZm*Z?iT(3ZM9#lIfYH4{fUqQ~SW7r= zKSWS!I-Ms%j6?gJlV|%LM8^RvfhT6PnF;cdEA=Wi2dUY)ZUzE2ax+=vTBr zDc_O3eb=n*1a$k|W$nz>Jvozf&t=jpa@hSI02*7ZOe|4eT-Ef{D`ePzHm_;8N&{bV z{iwcenejXlj*LnXkJIXw#j)9}Cs@C<%Y{2@4TRM&UG(KB4d?)*d^yiV0eRo&;}!o} z8Ousx1(}SQyNyR{8II4aU-QrvoJ2-`aBYvRL^#<yAjUgN?pPJ%< z?(Z~6cy}5M)Hx3nQhiOGfclsM!u($>zC=0gKx2U}-rwxi&TDF2v^T)g=~;$#&1bA= zp(&;fPdPxDs>Z<>eTmVRUR9+lge+k^WYz|KKW?W zK&(7|@1*ffCVqas&*I|eD4zo)i39C3rbZqXUQ9D7Rx%bq-neJ?bko_GXLD<3?xJ-U z%g(KhR0YCP^UKPO{2`8<{~!@VbIMZe$LsC;&U7+Ik<14U;^!khlBtj_saQZiHySLV zU&A8`0>>bAcTBl$g2ycR$895YJS<-I(0D9F0K@AiUIvup($?8x024f#`$J%w`iyvp zD7}(6o?~EQ3LK9Nk|6qU(Q8soy@8u_A&$7#2UWbHJr1b8g|xMOFIaeZ?k(J*6}Dzmz(t(e$73H?s<;3+ zj!(*Z`@e{wu5fF!8fuf5ODu1Gi-Sx@1n2gAZg;8usH7DevD-cs!v>`TM0XSd^D%{{ zLc!GtG7X*gpT2|ENa_Kiny?%r7z}LzzE$T^fZd(R&1FA90O(>Mf+FCyg#Z0JWyIV; z^>2~cU>A|+gusFZJhs(Xy>AxPr#~~xP6TGBAD4GEeUjG>_gLT8W%3e3w}-^}*e=86Z?}YE!E} z%wKzuAx>9=U@P~b?NFK1CqQa-8SfQd;NlUKl3*d(74Ekg5{-QfSv=!7C`q7Ekha z&v@OwTf>eCx;uJgxIdoOTxt%N$j zIT0IfKfWXgZe-d#M0oi>;Unyyr}DN^7LvTNBoWNYH?!%7Lu9QR4yryOxEm|3a*UqU zp;|rmnp>FtBh6$;tIx*WL}E1r?B*@cwSPCmj|X^6HizY2TE+?@Sa)z;C~^2x&CV8Y zI0vxvh_KP6ROKdKti(pk?0R&)Z-dtk%aVfz=6}tKwxtv==t^sn#Zwc`_o3}7S=v4$ zgHaI|Qr1HWsT;Xx<5ToqV?XbHy=P-IL*j!)FQ%lx-(@E+4L;Xbd_STT!6rR4V_TML zR~VrC7hi{G#9Xj81WIz&qno8oY~qwraGGjKwa8TD+jO8gn=^D%Cfqb$$gZPF|7B0) zJ#wRV3K15ITcksD+(FGrj$A^Z3;q~f!|*q%oLr8Cf`i|6*6mx6GbIA>wsAJ3rR$_# z56^TGTOr0=ibtchoXh&;p0O|m={ne%!cTC={GeTumrrK!6L#8&=R}t()b`miVRA5C zvIaYv8HF~=;{I~LfL-l6^Mvwvt4`0OR)mZhk_#-SMag#s)l==a8?Sc z`F1RBY@%Ut3}f{@RTj3VaB#Yr%Qm1qHgKh$;z@sS@BQ{QM)gtoOhuL%pUamr%sej z63^)X#B}ycF%Vn(F!NHIDqHc<<*((;cX;@6P8DGef**T@Za$Gx? z*UWJu^}kW<20&NBaLObQhldGrnT#-H!Jdpv{j`-~gEzvr-GC?Y9rD^e!gFS2BkpfV zw@d0WuRiz5Tey(pFWBASUdt<9zz`$Sg;gr6&Mw?W`p=iv1UEF+z*qSQy2|49IoI{C z7FKf;J!?J%GE}KzA0L7mDUS)V^dGJazK<=22;gQRF;@gIh?$bdz&L}CqS2hFO&VCJ z-c9lbk}h25rF$;I3pXR7dP3w~W%o%HQ9@}b6rYfCNEj@VfiIKECgDGa)@Ls^y`QLC zvwKV0U0YTA0902y2_fRvVdju0YrCA}Vq&%9)mi=lWUuG%XB==7KhaF3lZ#xRLaT&? zy!N?qgt*8ckB6mSOF;d_Qk3VUo{>kNpxa{plEcqyT#Ujo&{^B`24DuhpY7E_4L5c! ztg`v)$dS6((CHud9U=$XJ%1j`K>E}5$#->iKyBzAyRdqI0#-stf7@;QpKGNxfrjqE zGL&92#N48m6UWThXztA{oVN4uu>NSCoV06KFC+u?Z-4oHC)G$~lO&)VU1LHht++fm z9Y-y};a3s;PG&q^R(gLvVzWba3};3?O%27eyGo}7)Af1ZQ`yBCp(B@2_-+*jV$vj+tI$Th%yLuX*?bxw`>&KMjo6a?jFqA* zNyJvTGty6f1soQ z=$XGWsP=|GY{jp#q(mrr{_>$Z|CA0AT6GAQb@76a)-Y&~q|$u#@qnt>vtQL%{Anr^ z4>*yYk0nzg)gXiJ8a2GxIGr~z{#w)vf6QXcbYydw4uh36Q%XZiT1uzHrc^x_LDi&wof zYMXWzva=rdubu(x9bx2TO-SWgJ}kZIS@#}|4fKAu+7@Qae1stJejL^f{~R2TIb+H@ zPz;3x9KQt7usWv*C}HL)`TUkM#}D76VU(orlq%>u(N@VE?`pA=r6>|AswCcUb#iyG z6pBa^cWcM~v}y3S->qjoAl1Xor2R4j+-C=y~3 zDLcv=GY%ztMiXmNZL|dG8IvxlHDFk!CXASMHw*f|+|hw3_Z%cWk)GE}`xg$cD*F_O zxZSGh{zd8iXj`HKfZ|40utWwVZ8|g8yerAs*^iTU4%;rHNypw*GC10Sj;=6jp*EyHZTLW{F$}3=2%^LI%KnL+iSDvi)%j7#W-+#kX^ro(#4os@Qpe-)1s(LOIJ4rGm;J2Zbf(A?5s<( z=eU2mTxl>g*H&t4^tJ33fc_(s@gtq~FN67SLiYNR>5ER?oSaDdCH*CZHiEG};HGNp zAP}5(5Fy3ky1^cx6_-O|&85@lvdFj)&3DCE&`a>4qSrs82>E`XkbavF2)L9Yjd6`(v(=XZ-(u)|*&Lt%shO4#MP^ZlKit z?^3!q6mVG-!QJ(1r-QKrB!ZI4=@;;f&&r=LX#chT8#hLGw$QHnkwzf4M;`Aub}0Hf zdB)Fjz0S;1>bzJ$?7K{f=igaAaE(y#NF;bHNO~m@{lk5-nQ9`Eu0NH<*SQ}yTSq_I z+`Dn~lW})*9+21K8vo?V#0`Y};nb{9!&O{l96~+S^O>5g9$;^_GMZm0Jyq@bo zddctAbCFr$Xq69?0RJFUdo7bm zzxBO|A_!U>cnz%jc~zziWXj957Zl1;vhh`G zm4INbrGtf}*@S;8O1k3lR;p)JAmD#Q&@A})u9Al3Tekc&6J}#uDlP&IsmlI1Ku(j) z<|hnQ0mSt)8pQk?PoDZMLMHsbo?#VqMg>Ow>HiWzdbi`Y^F;w!lyGB`T5_(TXsuQps4^bPF(rw6bt=c6g>! zwzKsPCm@weoPKGt;+=;aLq@(&bgX6W4c`jmPDj<=nR?NA7((BF8*h=k*54~Zwg1fx3yW0n{l}_YDf8BAuACs|&wAO7vtH=sv$m`l{N{~aFFfn* zc5AUcwhu-3q9|f1(dvpVHeG3{-WL0Q!1@>zO}v$(OeRBly+PG$d+FVOo51LHA^|9& zV~(v!ocu&4d&jhC<}zKX)&J<}`c$z;WQsU5iB{q#e%ILbi44w>h8I5138>;)g%Wvy ze49cm7m5{`(YMW;(457V#zxEHoE$Hs9Ncp1bA`m-o|N(mLyy->GRfrT9sUJz)^uB` zRojqmORX)lnt5{bN-(C0N`T!>zfa-_hxx^}G;!H5kGK8zfo_;UjcEejF=bBD`LDyB zZt>(klJo3FHb#7#(0#zw>5GNnHz5e@9UmV;B7~vw1N%XUFklbak|nLDw{9=)Y}bNUx*`&ZU2hLlc{(D6=N=cvTqO{9~ah7o&ZK=T}UUZSxOuZj4gqH_(fPdwmJ@g zVoN|APRXhsA)|0qI&88&92bvwaJ<^W!?O_JZ>VU+3LGvD?;)tPk7HtEOivWB8yAO* z-|__+hye@x28cbSFU~+;A&7q!%ZqWv%e&&@Ca~=BF}zsdC0-xKzwR17J}+}h#7?PH z>~M-@^4~=csZ`|rV|KFLnXIuplC>EQO>&0Q@{tiQX(_yuZ2(ZA^4jEW!O6t~Zc+_! zxmRTvzp0l>_CcvVKr1X+T~z>3+g__`&O9TEFzX`kiFK9vySm;DOY#&K zd2yBUcCUzjTWlM$L*o0ED$u_pc420ItqWHBn&>SomB>B8*l4Bn_H&)Q=u>UK#@S9z zgji}8oEFcd#d@9(GXpGf%&+vD`DZ`eae&}WkuhfxFmErIPKI{IV9fY;28Zzm+!yKB za*E&m;Nu=I*_hl`;j=9OON*8PI<7$ONK55O!|(HiEC=@;`A62XS6yY&Yl8(!W3cQk zz2Z8bL0zd*>;IZTj?`qWF2blfJu;dV?;bdCMp78zmP; z4?)nmgOH5}&qEN2tn&wI(t&gF6mRXAFTPudTX$jYqD4bPYlj*e*G`-$@}i&|WNKV9 zq$#7mW_S5U9QbVAV)`fJnWta83fhZ9s%SJEv$t7NGSB4`H2#S%B?XYN+Y1{Yp&-%|K}bK~IDC&mx)RNw>S zdx5QuJ$-u^YiEn+CgtdKzHg3L+|G3}%+oP>Hfhe*6D9~gn!~w*EA|u>iQQZQ_r5&l zbqsE9f`@ON*sZwtetL3`$M(31dG|m2@&1>@4WHCOGPlGtv%LblNvGeyuv3rer}w<< zW@vxI;f0VQnFqp*iv%QvLSU?Ud(uA@Wt4(UTv^LM@LOUHgFs0^2p1WY^3b*Z{!T;H zpo2u_6Bx&w{`w1tmHgq3BBa=1FhHU{DWOI(kM%UIo7yviQqhs;_UoETANH3rZu`#H z_Z(YTW+M+vv9CMkt!7NE8q;WQtJJq23EmU% zZ)JkB{2~@!L4xr3hZyVl2;&_!=n=Do55J@u!{7LAFva4Zg&;(q!r?E{$r-GxT%9cQ z(uuA`r*0O|NaJZwDYOyR6c^SHTpkrt|IZ$Hb$tBvT#j_6MEWZOJ_8d6o1apdVJ7|b z);mTD;vRE53P&R z`uMM^C<;ECv;lltCbETj1p)#aFmM$S{e`3&d&9fA$A%;+5$Ah0Qi7yt0za?F>0~{$ zE^>NQM@I1V3dp;2X3Wx4KGzI#)nJlTG8XY`*blx3oNT79z zwLaZ!ky2A7rfcpq@*G%2XsWJY&T=%}xkUu8){#tTqSk{{^iBlPS7^CgDs3dX*4YvT zHYC})!z|wq>rzDx@_Yr{dekA?=Qc+MlQC+I^}RqV z8SG@x1;by^je&k=EOx-^|FrTojxqQiqsM9eAG9*~3ZsXx@jI<|Pv_W9m(#d&WnXtO z8vrcjq8P?NHycI2KNkDwSDi-1nC&i>Bjrw>Auo;$7$v;nS_&NOSKS%ia1Ke*>1B~7hhIBte zZ!XXWhSg7x#rDF?pji340oK-ldK;05Z7CJ>eSe7@ggLm60Uavh`|ZEI2e1zPf}Z^VfEKa;4(Oe=XB9WO z9mL!grl?w4y3gFJcNbhiv-gg#J#Y}AY3>1UIQ8jYN5rq3E5}~G_P8DN;zG9uhpMF| zYp%46{;qp1U8@=e{4US@=<|&Pz|Ti~r`5X|Ho<&LAD<&mnBNWSU;%tO1|-+&khM)Z zmNIxOMk3aLNZ~=G3f&_kLs8EFe#@Y#tdiJOwuM9*ScBj56o4CWl~fOr-j7Tr>M@Vx z8KI8`^oVu3A2>0O$)B2Lw`*0$sTA0a(@P-2@9Fxz%|>Oaj)lH*pdSb=#7Ee03gW>F zHc;-pWz#O+b9)uJwFt~W0@<`EVwWh;y(^%Ib(-&pp$tG#l`*5##_uyD8>m&Q_gPz> zxu}Vw@<+@zo%;Sb1Tmf}sjHTsyn3>81LCtGrvz#V45Psh69T+CgBSWLOemPI_ms(8 zQW}#*_@2$zej32bXA|l!8c~tt8m2|hRQ_sJ#vpt3rNg`on##pU+{SMo4NPaV^8?b1 zyM!oRC7mh#iEc&i0Sd|tlt9~(`RlWGGT-J6+@6k2dv&|l*U>@&GonbHtY1`o;;WiU z^UQgX+4a^Uwy0-gtfQ@IzB3>FjOblf?R}*8h(IH^i!179P3#i8)@F%lugeZuUwT^l&{XB^;MB}|X6q#-8nGWo@9SY9 z_3Mi=EpgHX3C^1%tIVuytQDKSZp2+8BT=gjvUQwovbqRgY4KL!5( zkNE3rVY$0kYwn-1q*g9IHr};{iXXNfA0(;STgnw87C;NrK zcbbjM=`g3U@0z-TaTQ+a=c5~5xubwIIeMOkX4p|&dTPv4gu;G2Pv@pehip&@c-U!M zDDhbE_u%Dpl<&R+iS&yB>@`!T*iVExiPy!8GS_K5eBb4TA_B3v#X)d2oy^S?3=>On zpUbS?Qj#>`%3aS?cc=CV3!;1ONf6SjuBnRTzz&Xyqh4^a)i3n5^=)+U5Wc(S@9mpm zGkE>w*kY^aZOM|rvka9$7rx)VKw7<$+fP~pAxUdS%X0Xm7Pf4Jku#U#tDwVjbH8vu zo?d3R@KC}1Iw+7)L3=vX5z8PHc4OaEISYNsS2y8XExgEq`J{Kd9oG`7Cp`4s(^psE zF|jmdAQ8ACerV2Nj*IlWwR2O3o=RW=PgPqw?@}f*QrLyR9k4?TNxK#vBhB>k;veq; zXQ%s%pBN_MuIgYY{nY*uiVVS~$~5Aw~dG6?9yO;_To2p$c2p2oM+kb%GTj zf@6X}CS5brh5qU=$5hKdvr9E24@&t(ihhZ}w0e>JZs=SK$~+5|JYSZP%Vq=! z-j9=-b7Nys-`*IzY+EOBJL zNfe5-Nv*~_M7~lhMzGY5uyGQ%0SA2k>DOxrma-P=;gb(7v*DK4UW#)ryOc$w%TBrJ z=Q+t;Md0{~nZOr|rn_FKKGgWSLx}DBLsJEwO2okIpeU~;K3CGlfsTEHroPD_ZJ}mm zshf(7%FSY-_A!#G@UbgX&n{{VxwszSMQy=-ZsZu%Y zg${ggsG}W$0hcQ?C=kjbfaIbsJzFKq5EQEw2zpZJ&LFhHNP!-KC2<6lAvc8m= z1y`iGuHo5Rs)?B#)eRoMRR?kzu@)h-Zuf3yF~x{*n#^CjrvuEniU4z5Cb)+if&S&v zWC1+K4w{3)R;0ReuhHPMjVN|sCnKD0tfV+a8y!s&dPs_lGv+zavF|(&>@XYaVwu-e zE|yN5E*TTIJ-3R~GL26a6w16Tl{ekGKzrWU}U z)9jy0AqqS&Vu3z#>=Z8t1bR;lY?0*315f^czb3g(Ac-ALAO#=$qRQpky!D1hfK;k; zL;kNaQJ@+6tLRbVpWSBN@7A7|ktMcq=Vp_65->Ug%#8vZZ-c`jrW39eZ<5&3;Rs%M zC&j@AX3hy?HeL!hR7(5NKaN7zu`NRd7QWg13&aPI8y_Y}S%kQRZ$^em4wvfTgxs;G z!8g^jbcM>c9D=7@n8vZ`AJ&iQ&?pVD#0G3qr1@3vddX~}h5VHifrDrg*Qwwb&njC6 z->qE`x-)*(Vk@83KFclWfC|RO?Af2K>?2pXAezzoVbV+^5H*>RdL|UDw`OCpYu{^x z^pqpDsOwFVyLG&w5jpPXVD!;wlhicb8g0%jC8=6ub*ER%h(A=28dbe4Jj)~1uS%X{ z&V!NCO+WIeg7^~zF4Wa;NRD8LryUewQQB@}ox%JN{2Ho}qjD?M@UWFDvqSS3ZILod z#S?MSn+DxN0$3brj_Wevf(#z;9oxOrmM==ipY*vDgU^UBg{zBBK*;a8BdO#eziP;BipK}Py2 zAZgK8RgJHgvo!%JGMU1(H_O?sraNIb=(Q)EN$q@Csv;wll<{EW*oVQT_f03cGMGDzjqOa6P~fu9g?AiUuj7g>Kjp@hM|p<}40<;I6_7p6QnHuM47F4u8zT zmSwI9)Ls>$2r?M8m&bNo51?NjCvIe6Y+*`v$UDUOJc9};Mua#KI9rt?spVt(5i^MzGm^a_mceO2T=I%UUv{z0NH=a6=M=aCo zc|t?WP^mbd=PhT|vis{mO~`=gY#InPx=OQ(ADo+?^Zf8*z z0Y*6C?=at-JIk0nDE-zroXSy$6jwud*2V&haaMwtBr*^^l$D-}T)8BSTWo%*3Nxy> z4%aq0j0u7Z4ngse;&IYpEgd(2LLSk2{8CZd8Ws)F3S-^^+*tOrraPqHhOO_1I8dnu zugJmo8_HV8n9_ zf+Kr$kfUhD#;}=l;jVb%9aQOv&qms16*h$0b$c(ohl)5fb;xliW4vyok`@_URLB^& z(ksgkq*`-gO0-0ondqY$i}aV_5(Sn)WW+dQ!~R>t0>uo#LdH_j`r#n}Z0*%z$mKoi zmMZuoQ2d!sU0535n73lly56*1a1ck1CEM`iNk@ZlVcUdT0)@^4@)T&Sg`{OH(kQ4L zpTgq|HGI@N5S2SYXZV&$KKPN?&|@(K`bp&3rbaOnkyB@VQ_Ax;JXbx9 zL(Ym;OyIGmPylcNrg&dEr=!4&*00N47rFv7ctZHF91uz!lls~@)gh5Ufi@YLRgwFS z)mGH`NK5ke$dd^&MgtxSS28HULbv>OT9@S-g)P(ZB&C_!7`Z1(BCBP)l@u;~#M-72A$grHZ4-7W zCcM@XTnxjP)4PSZ^h>6><;pXM7gdkIjvSA zhjetSdbbpSFz)m1Ch!z$>%g^5DDu=FD)t>1cILqnG|<8`EFx!aWn+|7ML;A2O_q+f zOW0lAo*tdfg+Z^ymXAZrB6*X7!UmpaXuHJ}lf~vvi5f|$U=NJmv|Mskc!*zyHRj8D33%0Pfz+XMVB7jd!C*>x%cY9 ztJA}FHR|)7#>+Am*}J3f!XJVIPAjX>VH=X|tTpW-lg!#_AIRnkH_lHF=!Vo(@d*Cf zZ>UC&n#^8-MlQKGQ|0!GwAsSilq?RsvK3=k+E8hAJN5+yR#gMRcHmlU?YOm-SbGYO zu`T}lN-qS1EIs84&{~y$?GxGIW7ws2=}M21y$9`nIYsVc`smMxl;*bt8D`b;*S=dC)Ij!I4zK_;v;yL1W-VkaywD8fI zUIR?7zPa$q62yxw6NvtXF%v4A#tb&`{t13MSK!&ELZr~wwKKi|-2jBWhy`cIFiRjP zZd}8I?~ut8m%7`!00bEE-fTlSw(itt

jc>~Px=r2JzdAf#XE-aw80d-h)C>Jf`h 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 UQN@G*cXn2eGW>(=$KZQ40M%1td;kCd literal 0 HcmV?d00001 diff --git a/website_bkp/assets/fonts/Lilex-Italic[wght]-v2_620.woff2.woff2 b/website_bkp/assets/fonts/Lilex-Italic[wght]-v2_620.woff2.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..463d9feced6c351dee77af93a7f5c7d86eca47ad GIT binary patch literal 105900 zcmV)7K*zs#Pew8T0RR910iCP>6aWAK1IWMt0i81d0-m@400000000000000000000 z0000QgG?KWCLDo}IzLEOK~gF|O;$ltJO*GtQ&d4zffxXlPA_T^2nvPFM1-wrFowEB z0X7081FHfHmIwd@AO)0Q2l^!p2V4GZlSHI4cE2tg0LH4(&e67|ypM47|Ku5*jEy*Y zQ%mQ~E2#ira{#?oXPH?n1Ag=u$R)P4}!T%0|Q^F!n`O;eAdEMEOm zm){fW9#{O)|LW8$oolli?-~o&%bDVrYwP4wo(;CPi{5FZN-B<*sm`^%FpRYKyBmW+ zl7fVP7`9fn|ByxmF}QFJk}#sh-=Xg!hde)iH2Z4h!iMM?+&qXdTnHE2Ml2~b?@V80 z%3?Tt&!O)rc2v4S%N^pl4_~pRddPBC*ke7fchtW~~CB{B=#S^0{D(0(S;=jhweRmf^3#_9e6uMY+DOq9{ zp$aHPg{hLYo&MqZ<@UC_+in-zE$?o-sMVkY5C{P50e}B<&He!uSf~^z!WHPvR+FwmcTv0J4-$RA!fjl^o?4q5-}ZE6 zm<$=qr&Ps-)BAPyfEcAfl(PNt3&XDSfWxqh9(BXva5#K8>V}WH;cz&7_|E%bm|*b# zGPb|tk%{65v82g7GBS-3D(mp2CT-!5Qn~y;c8{I=GM}p6Vv~Zdu7J<*-=_U@#+d;I zPk@*=jWrd!=K8-z_dZcwwTf;k2_Z&O#DfH}fe}4g+=g8g4u`|x;{$abV8Weem|%bj z1V4kC<-{2A%ayM!4p?(Fb|%!t_?wgh=`<~`9xCplVF353g7krY0}Of;zH)Lz5rn0i`L?;s@Jpk zT_OQxq>N>j(NRP!d^CYZ*qdqi>NmFg_WpsQ;EY2e5|ajFwi$~cbAvq=h*{?hfKCm) ztKZ*DKVcYQ7i64pk`9N%-TN}!@H(rnC$Nk~G~EN(GarberMu`jh%ZPj)l!rnMhgIq zP*pYyAHw|Gw0|$q3`??PdF=)IurEN|C1t0%-h@w2b*l6q7?)$SX!!C`>P*7nGoyto z#=4Gkx>6dXRUl<{XRS5JLN?;!BwXSv4*tYn`D?(Gq|<^^uJk^HtZES-qspz5NHqu*x#WP>ds?Uj3RY?WdgfsIO zfKU7OzNeEbvS)Vr_JLpkd%CN#5}aw2EsHP|p^y|pOO`3K00!W{xq)#IX=BCBvU`n)T=D?V@tg*&q5!YUTDUIE74#N`y^-1LOrQtVLH?p#C0M z)PThJ@CtxnSuX06p$ts}gg{N#%ztNdZo}8qz9cT9_v#gcR6=7Mr_=Zs2rp;3+%vm; zIqY?Adm7{h4v-;Wh+_o(^qclSUPC>Cci&(px4CLZ+q1hMCZ`1 zYQkU|JdW4=&i8Iv@;g&bqYy}n27J}CHO*vNvKH9aymy>AKffm;YsMZ0?r0smWeTIZ zta1#&<7K`8kKw)Azw&(?q~c>L62VNC;A)Ta>Qy&U^j^{o1;G}P4R)qYU>Ss@QYo(gW$()FnY~aF7PcrANCFVw3fc-%wwV5{`wIyt5y}w+ z35;WdK_WDY1SN15_f9L||7)+a_vBIj(l7lD8XSk$e6UCswA%w)i^PhWZw!O3U zN1||Q{|wS^OQ?5ypevMW%@~wMc!l=xJhm#O_2ezN%Lf5QY)=@*H@!!zNAowTITRcO zbC-QX7{FmGpxI_OwY-|N)FCY)grIO5i9G*lX|pNw=v6q3%AQaOPA$J|vgMOH*Sn+D zL2XV2N8BMnC~Pxc@_(w9?SPbax#y%^=Uk@O>vCwFnr`rC1_R6h5D1VI1cfC*1&We3 za5J@m0oq4G;dm)!S$i>bPO-k{GM6b8rJtM1Mdi+I;i9`||LZhP`3!&Frge5gi4w9BFk}HUvcgL>0B_m(J^T;E&RJBRNoJiu+YL3DIyX? z#Fagq)^EeF|K^nYIshH$Av9rdC5VU=Qb^&7>vgkD==b|VJ+IBEs~Db+5`oh*nS#Qh$#@uKhPd_3r=sx`bvn8^)a@l}N{blgw3v3+k2X z{5n6D1qC70BqSlFQua2P8e(?r-;<+i;>-n(s~98cu0HLTRXyk$dpwevy~rU(q9kHK zV$|gBzCZpfm>mJkpKbgg?B~&kVm1y$F4t5GHAT2-5-svQe}!uVAPG_g)M*(iW~AJ; zD%sSE(ptrel`2;!O4&H(=x~=Fa}D{X5#KiMd#1f%&fC^p^vY$QyzHmf{PAYC!YjAI zI6@R7PH_^Hqd*0FsY!?WjA+CxW{9zLJ=fXCo?{%j#1l2%Xz}HrFcFCnmw3!DB_&Bp zQl%$dR`M05Sb54-rc!mPHKq|etvWI+o;-VVN>LA|R4rE^ufi$SWjLg`0w!sw#33Le zd_<515e=-v$dU3Nz=XjO7&JUGI*5~ZFagZ|CJuH3%m0SqUT|iy90>m|xdpMRQq_%b z4GaY|M)T1p#xT?jeEtnGL~Z;cAzua(O&0eXi6u71DubJ2{jE~itWwlz9^JQ_cEl;! zHVzE||7y7*J|-i*;y@e>BOtkyLaJ$VTaHP-gMd+l0Pw@x3JmWh8lz?`!z_I8*P%yg>LoF`*j%#Y#~ z-vlQzaY@cNs{Zno^J^@E|C%bqBGuFB&sKht&iqg9?v*0*iv8(>`WnZ&RsoL%D6aa9=wy0rm@BJ*r&8M2j{D=|g+QFiZHV%Mv-TeY^ zsO771xB^x%zYqja{;A+1Jue z(olG#TMf!?q?f*<+96?&2D9MUSttJqP#1eI>Ohc|vsx-9(@os%( zMb#MZvKN1*Wjn6Be7?Jz!DupD+^v^354*$Z^7JxH%XVB(5S=fK;v|($3j{;qNP0Au z5leP8`gFE2Uo2OfTf;cb%epz7zVCQCUrs-;o9B8wZvXSq@3@Im9UFK5 zIZ)QwUXSnKc<^Vrw$aJ-CNs0?%x>o9HmBw{cP(t*wK(~T>yz(Tn*2n4@*9oGpABA? zQDK7>Xj!+WX;r&AW1Jo^A(T9EC~2aoeFS_F#6md#-|TktwT+hrOkfBD@j=_T+;|W0 z|A3Sx16C%29QjC!&@gfE2}#H)Y3LbQ*f?1_;+PXoIpds*F1zYFTlO3|aplf~7jHDa z`~?aTCPI`L@tBgON|z~Hu6%`xlqgf7N{u=Vnz3=T>(ZmofMK_cnlNR?qNkQDg878WM*aOEO^0(CvNL*vyIkUYqgb@XQ_0U%3SbY zE%;|aY2w-`tue0WQ}TIk;ep@|cii)!9xXyMn$R2zyke=9*4k)mc5qvo<*>3=FS!5P z_62@7%?}xus#CYmQ@y7$MyYZK*;zTkR^nihMPaCD=olE8S$}HJ*}=`r|15|ELwCz< z++V`gW1`uALoIDSAtH?gVY(6R5fTy@B~(HSox<>8<~TWtrQ_f3(s;YelS`A0>)fz) zY+heh>S+oYmXja^M5JObXMLUr#z`N4QW+T+-v~+Bt-a;ipJ!~Z=zYNfojo6aK7z{} zCYCcU;piP&XC4AVwa`u;E>3kX-7*{NE|VkL{jLYhZzP&CgxZ;w$%?yomI6Pr=)ORwVal4nADBu zb6K3KPT4mklF>hAXvI)?_^>yf%!&&9j)|OfU&E;0y4e#mVR6p-B`<7p3<^ zCx7LeJIz@vxBA>R*>NFN``oAPb^7I(_btgm!3-C;!U8wA!wMTbAb|t^q;r+?7pbf;=8v`b1>@! zm}~jfRwdSd^XA&G#vi*O-t`5pjkA1~r{ff#;+Qz%BVLGo-sd~9!#8{R_S!TC=W7y; z&*BSS=5u=se3^^0S@cwU8a-EkGhseXaQ;EqwTeHVEB^PjHE8Ri+PxItwk3AyG6Siqt zsj{LjF;;0&snI~!mMTk_!Lr+FG0RixBv``)*6B#8{56?iv+n;Um1REs4Mqzcs!WA6Dz0W7|PUG3*v?JgjK3_{N5q@gGqpQw~q`==^^QVX!R-+Sx%_XTh%7 z8KL%b{8RL2`-FHR&#?2yzsSng_xdzV(j4M9kJugps|fSob#BDpbS-}p%Z6t&o`vhB zJ;??C1<%!P43p1s#^)QC(PigiVEQ3Ov2rm;`=Td(+jv;C{LyKr5jC#12BE*F-i6>? zP~K_-mE|`Pvqyph>l_UT%I*sW^v7>BK-t$uyJfSx)wPkX(O#L=9i8{eEXOt9fnbn1siJ_FdnQ)r*5Ri3B#8@Lp+Ngq6 zlJS#LnV+2?zBtpku!K`)j77`Q)fG9+b%m0?YdlWGK}Kr;PvKTLGhjdS9%QKcuzA9ptvlMP%hluKl?UHZ21DY4OIaY$4y26vP1 zSk^iwHGUS^7f-QaOA6z+>=@EeaZ|Uzf<`^_G%=-7$ruM1(P-o@ZS>i%W`bxJ+#69@ zCv(h*@;@9SJ6gC$Ct=F+YjBvRf?>-YV6#XUJ(kRl?E2&J&C0W!GcRq~^+)5a(vs(t?Rrd7!i|2`v^{!Q1! zV?w}+{{&#soP8Sr(+A&umiT2PbL?R;#2#EsRPiLMRp}ggwBOxfl!$2e@8YpWvBF?{5V6Y#7IdOuUXEE~>pA z^@^a2Hvw{xztx-(AI%W?M{Mh;B!jU^!bGTzuSpDE_w^uvbkhn9>5H3e2(vfLiq2)v zZfto;&8o=FskVx+MS61gR#>MWr@i!2K~BvN0&eLGIIrPk-Lgox$91v@T|b+&nl8#U z&^S%tz-Cz4qugQfkn?q3a$f*3%pI9C*QO&lczNo_Y267an;gi7rzA{zvjnfdJIzLS z7=~sE7}AN%)mIiHV-MhD999Vq*2qokEPxa#lLs6D7ymV3>`c4-kjtMTE`Og9euXI? zOu%P0ui$zHpdC((%-8?oWL(S?A=p@W7CoQg)aQZ?!J1p2)Ic}V#V{Axn4Fo!$l;N0 zFt^eG@^Q@8Vvknp(#%r|Ej&?COPA=aZKanfd_PJ_A3wfo74lZ!zgtBm8Uwz{5STs>>l`Okv@xl}I<~&=%ulLy#;=p6SSEiy>Hm7xM^u z(qR7CPo~KR*J%JHY>^p$usu#B2%#ZiR zSg|d^kvU`mQ)Xgd>l|!j;65qE)FFC!&CXo@Om8_sF#DUw0aUFejJ9T=oQbVC_oo{t z&*k_f?6>X0ke&)Yb7!C=)pG_~=bly6p804RA{(}xm-Aa2A2sW507)M^hL*j^_Jb>? zki2d&Scn{33({Ant=E1~o2EML=&XMkeUr9H*VJO09d_Acp92m#;&>-I$;pk#*RlRz zX>GFW6xOX*zd@rWj9Z%Y59SPTD(iG^3zMM13@ms9H|7yW6szdRVe@ef85COFxa?G) zBb1@U5Jb2S>Etkt>VUZ&Ev1GDGF=82vgx)S`ci>0IBVBDH9&Gi616~D88;k;&kKp4 z$D7tmFf_xte4hs3^D}~r(RtWfK%sT58+n82&PvIdBjz}xb|!KvTdAKmeij%wn{<(V z1~N0ghp_Pv%xS zPv$F#v5*bNn~6XG9f#2MEmLhfRdId&HK+>EK?MRrE=!D6Djy=pAfCl<1MbiY^P_nY zvA|Ct)oRC5s}{cINvGS;q=YyHQR{thTdy&8-KO0!R@B|`c}O>RZJU9VNQs1_2nkkspoEKpR^XFhblcj;YYN zRyIb!Y+^3ywHavkU*1wA?U6$hvGxYKfDmNU)MszF(CDF^ow5QX7K z=jVkUj+gW1P4kIu3$rL~+7raN?-y{IZb$P^QFKy~mZkZjcMQqR`C!9;NWT1=QRYXS zA@OK%+`Rt*FI?l{!b|qu;15jsM>1~Gw0UC+rh^j6DZ6)b+-v)*WNmnFM8N*TXze9mBy9NEFDUWX+{%;=vW!)As{S z#L#kr?{Rnc9p=AEw5(N6$sw{cd!4yS{IHfsds5J0<_#VKEGbzyLYx#iwy3C91O*5T zgAOji;~GMSk)cA39y70S;UmNfNz!ak;`43&LZM2G&$T*g|4{)02MIbXF2IE^!9Nfb zlAx^7s)LRUD2M)=MeGJ}^rN9+J}V(+gmKi&V8y{4A)>62GY;$&w3KN1_dv>~u&2?< z8T=JW6Pk|vl$&eD;!&BpYt}UcB6ZE_P7+%gt|c$!9nN+j)&*tBM}v zeab6af41{hWNdBq0&;AxhbtVe^F}k8m#->$g!ftBOXOY3Hot^p^u1`5lY=lB?$|V- z@q%N=4V2OnT|o!0@Vk_fn1}Xl`CO2zj!$E+1{Eq6?a801Sy;uNV3E65Sk#`~iJGOG ziZJ;uv|66Ih`vEv@kmR6^$N|Lmo(m&>*c9{<90+%Nl7L5t_Jfa4A99yU!^$qI-0d0 zpwUtUC0|VZO5NJUt5-PHm!wP)RO*c;U&N4-yzf?j62Ko_>CjBmX;=h46 zqUPJlR9ahU=K#Ng%xoM-8VC(J4S5X(PF5Jk-*A(@M$-YFZ-gt5c>DzSvUbi{XRBRh zeO$1|A;;ASlYW!uT&~Jh=2&v&cHLVdTn*awqd+2#NJXnc5gFujWjZF0L}ruut`yQq z@~sTJc96QsBbjvNl5XT#4Cs)CV~#_KUT&n4q`16S{P{p2U!!M#fmG2jKnnlB#(XPj!zzX*`@g`p5WK9-HoMeO^6|$DPKTfAeXrr;tkO*L#AK*5D+kIKz1^0!`V| zU;jzh`;i4-zecxSJ3vh;K_FkIX4Unei6AJC#1V;PDwzr3kw@*IqWzV{F<`%HuWIUt zCV?aprT@NmmtRY){IkT%zsmcWRr^C7AMyd$dvL6~N9GtndfVb#G+Lmeb#z$a5YL!U zL0@kBo`HCrEMPBYz# zXP#$15Q^gl3>k6Tmx$Rj}lX=4$1Sas5|{0G(Ypj zwPeK=1!Lmhs<%4XI&+F7AzZ-~^-@T#0T2}azqzi1Ab9wx>nl)10Dk7W0fq>|ORlfM z5d!?&^$i3f#22n_ArWD|bbSYfh;SKwj~Nl=N*Q@$taF&Vp2t9R4x>!SIO3F*8>){r zE(;|SxuP#US%y$oAzb1D)`!qf)JcBQWLXebF)0V0$!6k8(_jos94CllJYhjs1))4Lw%e3Vjl`i9`{JOc=^)gYPzlvg3-!B~8~ z3_md|ab!s}dFfxXeDw%*lQSbrmVIOb(V1+%Py}mm7yGnT=z4qMk>{jI@+@^|OGhl) zXn_Np2CAs1l18fO8U_$n%i_ez2}Vlvd*ujutAo*B@EomlaKGNg92zTJ5wN>=l4fiIDBf4D-)W5ySy}(QG@fY{i)@lBJ zN4_$g37Z*br~R9a^%orK5%|rNwIbMR5xUS1vadNGaP_`$&p!8hKaeYLnKN9jPc~vy z`2j;&YZ#sCQ0AKfJvZ+EfkRoloSCS0ReS9;%-JWIFh9Kpbkn_e!jAi#un*F8fD+C~d} zO?saWpmC4xU|jD;;fC5%3DhLUL@>AxHZcakxpc8T&7y|Rgy4(_jZ1U^E~=nGZ9-3? z7<6y+g7%@n^Z`=d!LH~l>uqT#zHfz>KGFu_ze_9zTjR&yh=19LC_N+q=KXUp8o;1< zs6UbVATYDXM|0PjtRcD95UPl=WwSrbeF|c5*$63SbM!t}WWy~8qZo61*U%jw44`3i z^5qIUJIM$;$!0J{2+JFDH97e0@g-@p9b$2>sAq9BS5jk&wKh$St81|?hSeCl4r^dK z8@lVav@?k&P z84$G$S2m@<2DmgUzsyK+Io81C+0ax#HYMG3Y`QD9?#t3*mgSX9m1GlLwWTd_4GEET~%gqzHmX>di5#pXjOp&YB}J~p-cz#FL6KN)Ys ze_Y?Zo$>u{eu#$q=v0if-f6#3kwh+OZwvJrhFE&H`gk-cmC;Jf={P@Y^vuvYdQ9w^L=&+8WeO$BFh(2Wn_+FF zIFdaaIt0YiQ%!9bxvvRG0kJ~>c&au;$Dfs(wyhiDAQ~ei+$u5f=Gg3IH(C3yDV>oI zqAyy=k;Ke^y4o4{aDHB3R16o+AaH5^HHL>vGXw*%vO1%Yxd&La0c@3U8wuZ{%PR+6+W(nU*JC%9qabWa;vvxEz~p_4rsc zCc?k;WcXwR?u_VubibP)5es>@G~<`S zbXU1jQz3WnKNyt(;y*{gq=bP{Ehg5U0A`mP&jC^{{q`XMu*1DEVih?UvfM=gI&zQH z&6m#iFZb`$pjl;+@@KCU0vfP$Yz)XCfEu1UJ@(0saG|)dX#f(2O~ukhOa613+BbS~ zGhV4}9(EV)(W(|^SRw{7p8d!i!GHg@4yH-NBHD^g(Ub_MIn(84`>AV&@IgafO@GFd z0z>eKh;~R?yQQLV5=kbVa_VVil5l;q9E(zZHBzyvlsxPOrnS1|&$6TZKZQnx9EEc7 zl&R68OP>)FcGS_&MCS8X+<2HLz&jS$A}1K9n7PaXCX2~q%9th0TIL$&9_BmDL(F5$ z_n9BEQdw!NELILHpH;}BvBWGL%gd@~wXpx^F6VCIe!~5fdz1T+`y)SBoGmU_fEN{y z-jPnY**pRY6pS`|qr_BYW_i|CE758d-+f=k62+thlptnesbo+|101HxBg`;o}Q&^?m}C%ty% z{LA!nMQ!>2xY=@lzAN8TcWuqH^A{&D5QakWb(R}G`qD4Ij`5bhJ-^Y3rO~B^DZv;x2EVEwxue*Z0dI^ks2 zDH4Xc`hWRBDX{cXgI|)5uN*EZuVnuhuH)>GPf5GB%elS_U@%x?$3izLtYgK8wW@8H zBj6DMEU_*Zg7^(?G)c8acf(|?8xV;)sk+}%vd5RlV zBvX!Dts-i(WWby^o>=$Jm-xWnS|QLLG)%1i%vd0MQ04iKQE8JJXt;0T z4quS<6O$LrentA3)$eTn5D5(g{t*ZXbY%dcf2GUG6d`K`S<1^Y^6>#TMNJ(L~yXa_) zT64;duCO3^`O7arL4krw+UXf7&xKSbF=y#fpUS7=?U7*%qdcVREvl5hJ;e+NPvAc< z%9EVzc*ozeM`_EKv)tvcVBIU+%?)g5!|Pn%iq^H>^{;1K^%~q)ZpO4Z^X`~5}p@^T3_yZU(KekccW*s z?VH*4?dpc2xp8YF?3{ zXY~G^Z~x7&|L5OJ#2ZL`vlKX}ZNtMb9Ng1gVP0Wxlu~1fHJ6;Qdqh2gx=O&O1bvR+ z7QE{)&f@bSeiv->F|7CLg#wz=fj$fn`=2KO4oU&?Qh~%v;KnTwyWae~3vvzSo*N|( zkG$M+p%vy^lwT$Mi=h{BvtY%ADlJ@jkyXT~vZ%_6&{1~nWz|_uUCsGi637Y=%@Hp~ zlxVT?708w=PtF8MXq+coOcfF;GAwL7N+KLwg%qR&{TX*S{&b%wpHcF8eLOPt~O-YMRE&qWRx@{*c&j&^wWh2F3tub}8iSxK9yr)J%b zur(c$4H1uypD=NB(%9rFbH#}jBU%)O1le-ric~FMo34LlgWi*kEmQQoyXGZ%Bd?6 z>VM^G=6GIqn^o?$1nrJ|&^5T-mt@&7X)EQTI!bgn@@`c6lrnTF<>p&OYa&HMq~f5r zf$qfvrDai2EwX4u(gDkyG8y1SGt4ekm#A4Jbke7Hh?J8(5kPoiZlXNe=v?x>4p2YN zA1;@NXYK=hr;!~yR$#yN`;ibYxhWHtZR3|%nenOB9S2Z^uh-_2EDXAM{4%__%YKJn zJO=~|J^dF1l3s(HRAMUyWZGvNk|34mk}f_)k3`@4(1HC!bV*pN^nu{@P@+-g&B{yG zW3_%UHkOC$x3C#cN{jjuO%m}$pMpcQPG!2HmADe92M;(PfzPnpZ%F{aXD%PEE>mhE zHv8m}#4xt5!Hu1jpUrP5eN=DO@v@1%@;vj^I7&<$uLNZ(>gm#*l|!El7v<-(D1h?- zU$4s-^g+V_4t!B;cd>9DmoYb|Q2;$GffRYHSUMSq0wEENV(H}LO}n*QFB@hwUAfu| zqYrtwrhFa@+G#@aSq`aL&5BrPf%ztPZOMQsZI^idBGCj zUpe#g#^YmUw_TZzUG1-ZICGj$u0&!Br41c(8r62i)lwSm)9il$;@IJegp>o(Ktd;u zj#H{A&~XZt;+X95>+L+Zj!xj65;?8Y+?~QRc$9Oqrdn)c`LsSq$F}tF;f3pU9gWAE zAsi=q+Fkx^f*4|eBjKoYvTm(3($IxIRLYg5dwhwvv^~5LuUAL$`uj93XNq%$zV0vw z768D`xp@rjBtyD59lhj3_JrL=6zZ0;T`}3<{u~R7MU<9V3<;JxXi!cJah# zorFYy1P(<)cSBxM`L_TSEc)la5b_3XS>^1gHg=5=OB33>4I$ zGSZ3GL@X|aDmS^a3Jtqm2LE)m=($Qkj2~JjA3+4o;83=W-Q<@7D??X<&MlH zz+_I}fWl?tcR*JifFNL)J<*~qkI*!#nea}59kRytJnXfmo1^dlTuWOB^w0sNcRMj53{X)s1IM(8gn z2R?Yu#QqC@xWfit|zfK3=%S18OW5z1?DQV z_ulZ{V?g}v<(XCA7DQ`uJFS4AjM@hsCM{ienq#*0X@`HQeL)!sHWa?Encu;CSMXk4 z*f$YA;|OTP02?E9l4f_ls|@D#O~FG(5*7lwY<^6zBOJy6SmN+mu#EYC2uLP_XT8Vay56Wk zjkqXb=m-Q&qEKZ(_(Tv;V(|?YbHWKQFCuabF&orOM8Ys=A1H7K<*;W2@&h=GGz-_u zRu>3JqEe)PNZvcQjVOBX&e6l6&wH=u*D({o>eE^{UDY?_@uHVQgFFZFdSM=**>brE z7v6Wy6=w@0o-4oSKAx|*4^na(f;&~nCLYv~wKD`@GzE)Zat`cckhu^#+{rM}o$9}S zK2%NiaNoWa^_Su1Ox?(o4mt2Aj`j^;7W5u`lPHRGeK-S@?1T8;D{s@($!1=Xb39^; zxxZA;T0rvwS>I++_=Sm~)ut=PJg*u6Fgy7-#u@MB?h0s_P6i)c2?adNiDNClA}!|qClKd9G8dP6ysX)cPdBwz${IWz|GyH2}~5#nX@ z;6t1PrGTgleUy^cM+BH3n-nL=;j$?T8kb<`SU&A(WYkEIq;fB`DG}9GbnPnh8UG34 zAPI?%SE#3`mWV}T=!as1S81UnG8*_ZApL=|i?hDee9!bXV%K^PXe?;3(ezzFx={^; z%+#=O(1k{z>bpWaAK)EcjL^C|)<0IPQ|jfCTO;~S-yy-qrde`Vi_`%9S-fzT%{Jmq z7jONBC_o%&KU;xFH~r76blrwrMZ8_MhDF0(AQpLo8-bqWb9Kd4#Rc!N)qffXbh>4i zbhd>c+#Z%^dv4$wBe`_UuaRC~&{AXE!Eg=AECEp#38Rg32`H-)4=pKeLEQwj;ORm* zc%&wVKA_96X#qojO>Xz}G)a%}rFImjLXq;Lc$3$k z8)%1)nOH|j-)`63r0d9Hlyh+Lt<2@A`U_>SwxtSmG@}2UeL3{;%p8S}h4s^eSNR@L zxZm};9#~X|#OIApCe@I& zsr0ViSL~0`oRti>is!zS5L8f(DaUr1b7L&9xYpIAtuDip(x2I$am|d4sb5 zVc(gSx{x5czUB?E(06kmeL|0{d(=MQYb=v2Kw>{Q-!H8{#y37+HOTc)Cc~sG$0N$e zfBZP!@uAfkYeUfI%Rilv|0*St^)2%VIaDpVvZvJ*HAo_l;va+$-9TM&1#O}XQBDq% z03cDe-n$p9wWulbgQZjD?Oc87Od`E&2u6FP7geEUUMJUy0E$N*k2ZXC$fB=DSXd$Q z8l^V`+POf49zlU+usVoF&gW_)`pYx0j7ig^tWe_ z|K&%}o4UI|Om(M$17(-MHq42F?bqFBnmX6BnW|q$Yn0Ij?&jp028W7gebIG0c+Y!f ziLPIp-66NUNbv*u`rw)DDJLElM1~)A+FU%}i0l}BO$E16{a2d{7(Ba%3zax^1${Sf zVn5($bukfsC&NW3m%tDPIfiw00J6il5XA?6s-qC=g-&cWo7)+?Vaj_YqWC=3hx=K z8t0+yzT>8s96iDx^K(^F9h_0kQHI_x5MD?dB%ne_tlxgi_Hf_cUx-lC4xLePq$#um zt|1jSXD{PK1_y^G*F!2wSM9l7%ycu4Z1A8}!*(;7vhDwGdwbM1W@ql6!r5Cj% z+sL~N;{l>A3D|gON{FocGAm3_qW_?DIabqD4*CDss zp??;28!6-PN8txeW}B-xNdw88@Lrxz`E4*dEs^huXa`aC1R)^OG3UN2$e zgI{xlq~#Ilyez{p=D{#fF{Tx-Sy2PcEd`j5JgV1HC)$DEYH*ZsEo;3Ao!+dXev$*w z_)Zn-2avgflSf7#!JM>_b{lVlJs|l%VG2st`qyHdP0GBJSBP|*7@eu3_p7P{9QcjF z!a4kZoYDV@^>0?8e4T!-kG}7^xBmar8M(~k;K^t@3%zIXT$TdT<#2<*)7EqrI1F5* zMR67cAWIzUK4p*(ndkg;al%Bdf>$$u7H$%WTH^WI zRRuNB)e18d_YifZJ*rZ}PE7y-1FtoLpG>K9lsGCph87rWFT1^w` zI9MKEkmdy%CtUtZ&Ne9MpCXtVxg^|5j7ewzyp&d4Aq3`_ON~K zCT&fTJge(s*p3x^axdN#th4kO3pfA5fsdPwXDB#>g|qx5PTT{F_Yi_RAFI4v$Y3Kf zI!wh|SMqnA#1x;_DP(&R#{+w3nKNM6%^1Ip+=u3Zfe~=i^zo3v)CdeiX%vEoko9|wYD`g^6oA%}FXx|l-}F@(Z6cR*GY zL8F8K?rr~Nrjz;2U4H(6GTtvgtZF4j8^{w`#_)#C50Z0JnAhzan4lC~u=O1qBuqP} zi>O&W9aN6;$~Djl_yEc!$+@aea||Mv28+u>jj>Mu5g5X|)nS8dTI?YYOI{-SImb-& z4pUc{j&#f1jny;8Z9h_OpXBx~;4@USzGWgI(?3l0PxVagZc&C?-^tg0VLmps=?`KWEQu~I zLS&cufO&D44pHOOF}-|@RRq!?y53G~8u$?%yB^_g!-e6Q=isvApFpvp8Cf!-Exr&~ ztsW0G>s>eypg)?MNi{S{zOmgG+G3(_Ed6e?t>s8E(nTPel42@y66R{23X+$^MEx*z z3tAcF0~Rh)*f4LwfJ5-EpJG2$?rO{e>Q5EI4F#YD;E8O)q-;CzlMz@|HbS@NGqx%; z6(NE79>ykW#9beo<=d-k0xekRW$oAxu`zZOpcX%kMlnx0$aivW=V8kEL>w!{f|9@ODKUd)ZK@Gg^Y1uul9 zLo((ZnR-z5DYzF#T$l@?o{zyFOi(Ov-KbX0Sj}8BezEWCte25^S5{!|mM|y_mO{P6 z2Q=5BjXmN;BxoK$nB@n)AXswIQD<5}Xx`;h;wy`7&dM6pc=O1NdM2E+4BpAYfCe5DLI2X98HQ+~FmAjw4T%Baa?ue*>S#9Wq z+FqpVqyuajx2X*#WQtG-jF~egpe{N88JbxDvY-zV-C}6o`2E`@vfoQNZgif_OvO3# zSA{AG(G$HTo&PoDn6Tp+aB5o-n2q0>i(11#lXS(SLQT~|NASN21kVivrIJiFZH$va zZ2*=&7W1N)USQ!k-%e(>@cMA9LcR8_p;4*DZ+~ohLD*SE@AH-K8i7;}FWw=N;?P|) z*GWUzzCFYOHgPLscjqhmi{&*zmr?h_Ae5#rbgXRpu@4y*8 z=cLyf7|WwoJWUFRW8dG7lPe18Ej@+Ui?`LrRCGG4S|@LbWLB>W=qVnPo?a5e0+>TF z8$tB?70g#B*##4pmXIZwRa*%{V?r)ZrDdTJSCg#%D^c)S_qt~oLh@&-18=aaTd?Qe z;y|+hWz$fU694BrI1Ssq0V*wj9SrZ~v%AwvPO;GS(@x|a)*_PmPXhi?sb?Fa^EhPhTQCl~BA;rpzRCEa;yenY%uqCY_59cB1 z$#kHuFhOni%bbtFlN?#M&lg?eVT$r6%*0!dXz-|{EIo%>BvME&bK6nMl@&s)VIilA zE7c$XP2vOeW6paf6^;@+-xu>NGMtOR3#e%lfrAZEm$71V8G=gG zz&(HD;HR*0uF;jXBe4kzCg8c?<84Ioc%hN5mU<6uX52d>hoj%yyRsLiBch0bjN8{C(wEW^S-Aeow7BO?m^u)c2 zKGO5`taZ8!9!R82G?^M9lpXt>tc_hY1gjq1Ci*_bVqS6jo4~BQQ6EO>4h)fiLEN>E}91b#xM+Ty-qmmd! z2qEBbr3DpCgXw^3 zHs$i|5dOeNrJi}iuf7c-lZ{wzkqopf5gJe+YLZzqL$Q(pIe@)pT4lhe%6gJ+&Jf_o zK6C}oWuIiErNYm=D`%SO9f!Za0~BScF!ICo5gtUGY(#lR2>g%P{hz6s%8&bCu1a@dEoc} zOJt(@);KfXd|Slr=N!}#aTxS|Sd6wN&WkM+uYAX$Zt5cWT^8KM-CHXGJyL%#;%I;z zX<^l+aTpY(gx)AvgUk?I6+c1nY7MK0xJK38%+WHAAMd__pp07b3}`1P4S@gGtn9hD zxcbbQYr3;y#S;K0Hd2Ek>qK^B>S=oF-Slh%KASpuY#i@xbR53zN%X$Lv5!NK9@>V;K&^#y-HPSDxhw-H8enL7FNu{hZA-U){)a)sCu=pIyAL3LF7#! zgIaFdoa={3xOXjZ)Z$In(q&n|LV7Unvh{m^={y%7myAE`X<>Z97DoE1B<1;-~r3*0(+j98zNS!5h@6;uC1vpdbB5gmihV};ED~&|C`DA}IdJGizS`t4 zPmGnwjYaP0$U(de!f>AGn)k3^KeqjP){@xK)SY6*QqU_06#Ubi`dMAW@>mV}aV$t8 zQH(vBE=x?pgAys1Dh zR6yMo=uc}@s35W^y+7r8qa5MkZ-90&*}9thg-qaVa+zL9m#RV48D)#vj64>+awtP1 z`_{=@?Zltgl4nVda*2Zt6I4itXFy;nlB67p*xz5F;Hp{_x}aM0U>%D07p)vccg}NT z^|MMe8Ak4C0bZp4=JEelU3?0*6{L$o5eWM&tX}>lB9gG2qe1lNQkl;f_ zQSF~`%8|U=-nR0k6zXf5#fQ8Y#=eh%TutV{S~sxz#?M|*{3Y`pnO*7fK@S?taRD7q zuqZcdx)1E7!7jFY;ph$H7@aalP0aaJL(dc$(i_7&EWfF}BBpRGW^-{Y< zfXoZtpWRfM&C78p1$je%0<^YVa$tdyrG!w{=lMKs*U^Ux_nDUsZ9QXce;??3zWobb z*N$*h*q8d0QR59P!xwmSVYqOX)mHz{hmF$+XN-Zcu}TrG*sO9{L*OC2A(^_m=_1&o zAQf;t=9hw7*5U1$PGLu6qeX>ivph5lpBa!RxPjy1vpJ?9z=>l9XB25N@0-m?4g+N)@hyv$rDa_Z(DHFv|DsTI>A>o|rRn9wHI)O7^8HL)0D5g&_x<}mp)sItHxb02s(w{tpD zQL`wJ9w->WL>|r*;-%O)=}(7upSS?t2}l+$(kB4?i1q7q0K7V2$&p25kpd;6F3XMR z0~%P}7!hXSq{t+dmxW6wVah?3`Hod68sa4{mqL%H+mB6)%8995a3vidllKJRRQBdwj5Lh{Bd_~d*i@3w~OCRw;~cueL$yM z{0PmX4;=qUx;Y}oK8S5HAWlFlC-G59!0qMq>=RoPvGj&|vj{pOxaCV$TD&XJW>!Oz zH<2{P7q4l=o1fary3LtUfrtHL13}yW_AYJQ#53d1s1-PM5T@6(h!O5zK-s#7w)0NGtN$-$ejJxEq}r8w|Tcm zAv|mS`LJr&wd)#dy+fxo8)M|890@3~`|SBxMS_33`WfQmdo7}JLavqkf32P$fbXF)U^)F&cC zJ}p>2vzCKES{TB(K)*9uU#wa&mmZ7JKvFtECGI6o3@w&9xlwIS%MM6!W+QEWV`J=Q zD)z^Y1iM20JOo0=7SbJ58zvZRR%07VK-w6pEpihGQ`kX0TX+*QRx`(aMIg~K+(&ys zC@kk9Js@8S7-*KIm&QP@XD#SFfGLpY&XA-*FA8wv_j1&tcn+FkUK(<$_s`Jv^a)GH zj%q4j;gF{0W342wP$!ee(1TQz-F1+HsR`MQ&;gy(lCf7{3fDQo#1&2_c3>HaMgOfp z2PciY_NlZ3tFc$4gyjf=+`{uZur0W|SdjYE5L=W`#Hj}|!%k3lfGo8&r%b2u<3Gr* zeRA~!OWZx_^%itt!CCt5#lH3Ba>k>5t7+`qd~wqU%q_{AozZ@oIGe$z?{;ryE7+m~ zY%gO= z6V5#Nt#7Uc!5^yi??lneAmm>ye&04yATw}nE8&-ePFzrydmD+$hc;{sNNs&XMXmnd z7CJ}Fd|HJ|=V zI8=aiG?{ESquEtJxLhIr3#1MlP>MOnt}HmQB9`PI~sgtazs_Uf5K9gZ}oc|CZm) z0e+0RA{rmGZ+BaVZLtnIhdYG@!`EFw%X62JGY~~2(!P{$V<)at##q_HjUvE9VU42q zay2}GY>afwkG#bAA?*)A7Z7yE{mLOn3oVWZl~(%0J7}emJ1ee4;z}Ehbb`z)a;~@n z@X`d6JQbKIrzkqHOo<&A+csKg8zzMv`8@Y%+z%s6sgj8nVhR!(LUA2E0U6Ndsdq8e5)hNiUZJKvQ^jH`jkI6oVp-vD;` z%0O+bx+?}FsH4G#jb3D69Z=0nSRL^jM4j-q?HCzNB}IssmFtK}v>8q(>I;u4CZo$0 zi?b`SpYRW5R**3A%Q9_e`^RUPx_kCt_$oBLv*d05(Ntf0fhVUicq&lKm|k2lq6bYc z8jPX2XdZu(+pdkcp0|9HQ!E!x(+gaqm65J?0(UE;d`?k+P5z=Xs23&o)vC)$x$%?p z#oI66S$3C`kM3$QVlKCyCs;mN%29ZK)*G)`M0ATIYKm}d<3Y8A_Q)IQ)tEb0a8K3< zF8)WZm;@oa$U7f;xK+!79GsT3Nd`%Zg!to_=c93g2aSxHZTLK{4y4y>u@^gC@Rl7n zzwl`?N5JK(6>ICLbC{Q%pJ^LAU#rg1N?xHlW~;i&clN0RX=z=r3HQ-~xN+DVt??A* za1X(Uj+b0rFIC47yAPm+WDqeuiuN*o6iID|13v0ct84h$s~zP-`11HMc>N80O&==b zxEUBWE+ zlf|hG6tqPmTORDi>MCHrkeJIQda=dtBPf4MmlaErj)?r1yu^Zzh>!QnD=JA0nnU$t z^>U;80_KeWsVUA)&i>u^UDM{}n*rf6>BHZvJ}mbg>CN9QN@lE0f_LY5Zwn~@%(kP5 z=vPpG#A*2tO9g30dAE_=`sk_kMmK4Q;n|A`WfQ?k3V>a^y3udUQ8Sp4rsJA+@+ zTMMRz?f+-Z3AR+nP}wQM!grPo(1v?Xb%YS44mchAD*hBD2Yo4QY~K`UOrN#Cn?f-+S18JYcy{ z3ySv616g_1)G;V~=mwxP*)T1;(>4_!)K@wcE~(hxJ$os}@xV|9=I^r*3>q6g5>u-Q z6`R+bsubng=*}6A3zZV%`GtV3UgWu$r zk4@s-6V}SyiJZOo{=Ie~|KMxjyW$I3(l!tPzn^868>HDuG6pUs8yib>!8`EV@-EDI z2#OEZa37{$Z!2$0*VN*g!0?e~pC;{1O~;@E%`p|}%@sjWHy#WDLof^U5Vzx`G~c!0 zI5*PPlS`a0%H29Z(AK)qK`mjLV4AC|(-8p0{Auo6g+0;6vFy&A0i7`0V+cDZGqs}I z0K5euq1o^SH}i5q(mym7b4~!Un7%aSl|I=CwyiV}fu0Lz! zIr?&)p(VqEtD^_9BayJLFi!Tb@>r$MukC0t_}O1D?I@?t7?nltK7w7$)BwkS4rdkLkv?xfvmZysj=n~lon)fz^&JI^rMjm_B5Q|w2i zRBA^E?C?Eu3tw{aQ)EMgEA|_ulw`59ly9_D$=3fx+srfg?6V`hbWx7F78ks7OWr;J z#(chYY^}UjrRJ>|J#vEUso@Q4_H1t4qPoAoCF)XI|a|^wzg( z^WH+MZq_ad>^U+q^K~@vvfo}`Zd(K`M~*D-T~yC%+gws^nPZ!e?4I8-ryhtdNVE3t zE_WX^ZblAno^h~Iw-uxx#d`k0`o83k^NvqtApf?Ya!c6dP7P^9-&W;-41V>`h|G$x z?}P{IGAfv{1VWFqGqPdE#~XB?#Bv7WTPN}qut4aYiuF+PF}(5LgD0pj;kM{h;T~b> zP@Dw#b^5g$Sg@>UMXSZ1tV`PPVyYGjW>zAr;zprU?4n#U;zGk-zp$NxMbj04-HbWqTSosH4JYj)0-NjvuU)e;J=Wk;o=I!y@VImcqE*1r!cFARc`P` zMf&2PIt7tg@v1@P7KkJJ^F^t782&gMhjC{=_n&yqKzz$ufJg16I&q`D$+Kia*cVH9 z&pOFJY*jd8Nqlr2GZ!QIb0L@bvP1U2fITq|xJ0nulM-)Zi5m$ZaFWuI=qN!aMk;*T z4lq@8qR1IT>Yovs;_#%Ww+xIs`?cSRx$4{V`AUyKlxmT4{{??Rl~C4a6lPX4%XQwc zSfdZ9A0yOMcRZXs5pg``Wy3{>-arpxPiVv~#a;8-W$Gt)Met1zYUMrz;KH%P!*y5c%^5iaOC53`hfaG!xhM$Wa=6_ zyjiHT_j4;sIx=cfhwgRs`{33>ek*6x?2N40mfPSzjBy^$?i_SDjQcUptK{|9FwSe$ z;*OKx#)7qy^H$tor^w|nT@265n}obn>VdT$38&1aBKI4btF2JxhzEPdBqC>ER)dww zxP9`Wu_LP?TYlV9c=%$^)Y%j^RyglpFtreFD*BZtD#I53X(fsF{e@!low8zMMXSca zp!kbIJXQ@B9&BT)83tozi^fSCNnLU`kGP06Tvg&Q1?MK2^XW!&iPDwdL8Y83KJ=~b zYMuqs_A|vOo>;pVX$Cf(YxZQ%6eNG!xjy>lM;9yzzuKabw0||s;EtnVG-#;qD8`8?J=6aF?(Zt&-=01T2q;qF&vi$MxAHs^nU17> zM8;p}@D?$Tj;l6DPhIBrPy<;jMA)>Qxj}DO*y23O-HXF*y&Wep+X7?*6u7jZSjbna z->|zQ8+PV4_&>uq*}S;@6gr->9b_H-`_dP9wz01!hJPwJn(*7LUf4*dyUT55`R=u6 zW=-7ZcDJgiWb@C_1M$3CWe1JDQ^&#i%_WU`opicJiGd~ z3jBfsK0Q43JYJqITRIaTZ zCjlCDmg}TV4RtgefGTv721ldk)x*jI`ARErfptt`hUDu}zBr*A7aUFeYyrh$3AVX? zb^ZOsEj&h!sAxMf%VUWP_tYBX7!QY3Euzx^;tPf$A5C<>fL*Zg82?8SH!#(&Kb{my68)zFcl;*@ zK@<3M>%b>YoPG`Cd{{6awLcl~hjF2D>EX_`i^c#J4fLw08$ONljc`~axA$3or47q2v&-?8DDs@GlL(W#8YJV9=tBkUbj?&h$v@PPI;oEK4g>oV9w%46Mtx#5k(LB{ao&?Tco&{1)xAsnH zh|}g{ocqY@OL3t~Uo0!(iD9)L>YZV(bz_~5ShpSR;uF(3zF@Y6fN@^>BK-*aiHT<8 zI!=NgP<9I^otSQ_T7hwP6fQ3=nB%9t_Zi0dnQgM^(Taxt$ki`T5sa0xqj7y>-gsv_ z%N@UJ{c6Sq(nPmY=#?kA_{u^bwz%u!y`2ub5+XVgdA!71L3Mv!%nFy6_V)+tl`9RF zP;6b@<=0YD@Jg85H~|ewBAk}zT`r;7b|e8RQUB(T_18vl3ONdWaN%aH$yQG9G_dgY zyZ-$D2tHv%x1hFTlG)8qve0a_x~dn<+AcjWBgk3CX1BhSAt0qwn zX66SlK}M#uu1DFV*iiq2Ls12>=sZMvNSK01t!cC|d1+BG@nvdaad74IicvI)TyxvYo;Zlgl(LoLu!2+T*S!lCN$~Bg-nn}*?7^^G z{+mpBE!l}j(GYf5QK1Tt!skWYVAuBizy5mJ1Z6lPm{5!NN}zzkj~%4jamkVjzp#wH z)C6seU;-_k|BZWSb7%gs>uX}cxWnKm$vzMLA)lv>@C7j+S?Bi`;88_B7DM`3jN}n( zOpscdo=Wz){lXh=G6j))rik}T2-s{afr!;EYfR{iH|BADzLe9xj)X~LOyp0B&>2$& zihYj^V?8X^mE|VCfD_b(^gV4x-xAMiUI)P*=j14bvX!8+f|(suw-0~_18GHwbARsH z7pNAN#d4_A0CawTJyrbDaUY-Ce@Y%>;3ql!*pA-MV)aNLFurMVs9;1@Q zT;4UpKat-;SV4Qdx-?(uVSn6l67X|4_sz!QVabN9R^~-p`#_wxJP$4V?|)G(+)yx& z&>`HY8UTu_BoExF{ey~rH|If-S)K3jgFkZIxDU~x4}oGtHmYd|DPSsS=m1;oQmZ3s zXLGhXI*h*x$QXA6B*=-%EiR2Es%;{dTfi?E?!8iES)$UzF~@oi3X2lG?yAC0pL(#{ zyt)vHNtc{9YWzG@+57FCnGDeI`&`gUxf~q`Kljk@OE0GPnB^%g1)CN5>dE=zB4uu>cKvF*}ud(iiHwtGUyv zSt#hqZ=*TY^DWc!mhw1{bLC=I1N~J(JN4v0-}k( zmd{skd@!cqmw?SBa8FK9LGvPsSuu=404!5mvmPo-o@%ascjR+Mg+j5x0Nes`cW+D`4JXY?XJZXA63PmBvDXs&Xv7TR&{d(v&Z}$xF{bcC_ ze4IxK6*F4dJMyNGR-$FZoM@!nKY7CRmX7xRp3Ks`N$j1>F18&$wv#;y7qAS3_a>|$ zFXREWdW{K1WJH?3l(>GNrPw{9v8;j3e}P%SQy7Ce&{~~6$N=55BQoLCZlQ{_F|ED_ zAAf@NJZb0UQa8IXm#I3p&g5VS!vlWs#2D*&Dwk66UgzvV?Itqli}bWkA7wU|Jt`A; zN2pR^dE?By$zaTNV55>>(Rb}e)@5Y-L`oIJdZ_=h~YA+6cF?=MZ6i=P^Xs(L#)6gQ(f3FBv z)9fsC4q8D40yRH}B7|EVe^GpHcAuj=$d6LF%18pChl4(dSOmu?FX*`gnhO!Ng4Brf zHe{B?GRux`O-FLa6)5Y8lcx>^?kqN0z7uETDm!;@F9`T^C6 z>b=ONyk>6h6kI5eT(d!h%ge8|bSgU5qb?}&d!=q0@rwIx>%)3=555E&$}6l{B%}iE zF4+Sb#!jI={GVHg_cVfUb4V*}atq`+10^V}bf-b5f^LQSaS7)>XwNBFe4)&?p|%C* zvkr5su(_?>;zSiJ1bcEwD*&qs9WYkMu3f>o4+bkqYjikOM_%JFKFLu+@!mpN8=~v7 z_CigptvGJ|RzjkHu#K?!Kr=29W3Tk^f#ITUwYKK~menA?UBSIxMEm_@b%sPcn8xx>UgaHm^uW@?YXZeL^d7ko zLmf}e-v5nK7HjLDZgPqZ9pP&1C}R~_S7FLzFjc(v15J;zik;Y4R#(@OKTZI$B-X_j zI}2W%bIxOCb~YqkJoLih-nSD`e=?zaTTqPv}X4Zm*~ma_ITKq_G*1<(^0An zU7J(M2z~2ditKPW)GXW`9;^L5nfKao-Wa7YOH=?=^fW!FX^Tv# zJ+kjt7=9~*`J?8Lj@#zXCB{qJ!o}6u z9!1Dt3NJ0pb(0mIHQ=8kxB`h~mrefG*)ox$xZ?FrtaIYvS@9u_6I z=uKB+4TLFJ6g0282kRc!$tv&%EGd1g=Ycdys5rUM1ZwHgoDAxRx^rdWxpWgib?oha!UME3P(BDvo?(^^*YswUz26bw&xU zjnu_zmd1~&t2HQnES3(Y<&wn;Lo5)fdQ~{c7^RpJNy`l`V2nA3=>Oh}gKJicy zn`g3BOU7?z4Xc5T6@p!`(960)^_>DQk(9H@R|4lhOz@t0i#9j9@xW`(gU0oZystYk z5VdIAw)NZMvw&kaRyr|~LP}%)B38KglR|`cDUzh+|BBiYQ0rZBmj=UNai8Lk^S?q% ziB?c!_HjoX@luIW=hps=;8d_$yuxDA&s%Wrfrf%WOR;LKxr4G*H3Z;ug+j<)RfbQ@ zB8ds~w>QenzBn#8i^<1|b`}B|oFno^ILFbEK)EU8)*d^?K~gU&%?H9~*>^nbJ7K(s zQMyKbpTx&FJipQ62cXDBWxOKGvc3CYwAaiP63odE}u~sV`}j zg9i&xtMT`5ulb~Mfs=NjO1SAt?IM3{5ych0SF5)tNp{X6$-pgLE$ zsk`OdWgKH4W8FYN_b6f&6yjkT3z}KUdD%|=qI`-vI{S1a~aWiF7p!vbdf4n z!9jw&7=6>^HvZ4a_ZY?JC%;4b01smSO^x$ghx$oc`{Khztz03d6OFrIFS8yRNwAtRZ|1T)NR65f!ShRCvLk;lVci|8z)8|A6P zB8Kdah5ctg_l29sC|lO-0=*h}s4afA;h^e3ULP)8Pb+&xO85qdi^8P{;E#54mnyK7 zs)8roplfH*18$RaeVi4yr4oMt?r{mo=Mb44;3OZ=abJwvD21f+8d^{m`4TB5H3d!2 zpw7t`2t1b;3ATCjewcD|o+{4CNjp{o=MTbu2amF4&Fao5u}D;2gVGw06>jjF|GonX zP-9rg_egOZtx_1~|AHL!DU5JD;5QdHwwkPV?gDiSF%Kj7TWJZJC!urDQVrmu-cTIM zRvDCHFZWAi{d;`g&^>`i-j+0s3ddm~QXxiI&SqzB4WhZ(qPGaLB*L3SfPJVrA`tl1 zyd1YQu%WEm2+fSf+gH%D#s61Bb0Znf`z@bAWISZftrnR>dLr5`Vc-&TJ}5lOC<}NeApk0d#?jsyc8cx0oLeUw{V15 zm|w;FCRnsP6W?+) zsn>s0&qg}KIel&O{QSvkPnIZoz)znm;+*Um$5VWCpSnXtK@w_>3!ls9rE z6}tMt#qVPX!%>XmGq4&tipZ&!6nqdQKaFyqdYWS)+WK^9(b|?xC?%@*hbd1>{zsBa z3U-tK&CRt)srhKGH1)#_!AJIf(_xjMaafe(>ro&k*C2wNo1ACJu4lpZ(<`4BKvn0>2yO$D=n z5uD6UtWz&3jeK6bxms75L|jg_Sk`VhQ8F!NqXti6p{TH;3}Y!W)%rH_}q%k=qlBB$fM{ z$p58%laQ+V?Yr7)H$nsy%`p@cG55)v*Xg?KUVjf~Q+|HhaOT_kvbr!xy#DKoe0#IJ zxY8-fs$rHE!*M||rd~mBz@}Rw39LJ_EF(LE7xHj486`_|Jpv86SrrQ?RVI(y8RSoJ zC%-`*%okxDyN8~-D%N8hl!A2Xmn`zWuUhp@<8%zT-dGBjj&;RNTxb|}wbMP$Jl}x` z@jntgL=Hae`Y4o-I8|hJL|m|F{i1or1rPTLyq!cpSzrI(X(%=2TKynRg8}`%QeU;y z^sq2ZUB0LhFZd;u_b$mpz2;Nvp%RxKD>?SEltP#5B88LR)jo9YJfFd-_sQDK2uOM3&d;F6h%?gWjP5n_K3) zb)@6{(GY8DLEXrc$z<}?Y+cHQhRb$Gl)1jJGPNr|ippi|Q_B4EJ4le3ls7$)5$kT| zHSU@U|INJV6V@uhLyXP+>u&8Akby53Br(b#zr`GVVx{QswXYVoV2ULFNGdbz7mw=N z*XFWASBmU7e@Vhkx!qN1fi^}mtM7h>8~BC8)+$@;(<(Qqu>g z32@E`<9upfG+RC6XtgCinVye;zpTc4D(kOV40`a{L{^BFyD!7ZZ^0p{csGxp*9tz7 zIfju2%(7m8Sh6J2*Ws{YHib7~B!08BCvb-F!CEqoDW^94mr=N>N|=0odl5NDNA;&u zVi@w0fGD|K&7TtZy$A!uPIHf$;u3LKogJx>{}@vKU8T#`tboc6hs@9aH+kvel1#ty zpO88wr_S5cBMk!%5eKQ+FfyeF`H?p0Z=i*uEp=ALL|bEx$)bY!>|}}ysU6_BN;jmE zkJB>p2d+KT#4{6E_!3VSE6Ma{`YA%34F!<#B^Uc?Ul&=e!sW8QDs7ACvwKd6UtlWt){$recw!&k>tA94$aBrycgyhVnKp) zIo1OXF@E6o2wdh8)*`;a7xthLJFjsC3SYh43&%JG;jwSjHitNh#G(s-Qg!3(&>LnM_q1D%6IOQ8FZzLdp$z9>-e?{)Vx5 zOE|l<73Z+wATu+Sg2WQ>F1 z6Q^r2PA0R}ZJRniVV!u?x``?v6=gajYW=bN9R|pF{o{gxi8GsuOJtHNSW6qSG}l_~ zIc##rQ*5zlrXLSeL^-T&GA{e6#Qi#Pe4nl!^f25&h>plixZ;Tx$rJMQQg~h!z>X-&{~b2wz~JYH zRmVH2Q$ku?V8)`5@ql;H;zRn}w|b)udAiDk7cXFuPjZ7ec%f8^Q_<~zBW{SQJqFS^ zbxX*qGm9M(WTaPN^F*o~g+r=(pZjUyYN#PAy4c+f`56=&$vLBFad#cK*Y_J_2o^L~ zwqPu17NumJU(uEmP*Sw+JNEVumPi^&`#sofqn-=3YV^n3W_`MEX8XVq@aGw<`zk(x zy*}yEky27ty5b*`J>Y8a6q#+lTCtnP~F1feVzJZ*Zu67vUIM{TiU|t0- zIPYm+?E4N3)RA&8xEcqq2F4z&TWiOqJ%RZeLtHG48q~~M*xw?8by3y`-X(3nVe^&; zFit7~ueVzq%E!APblFspiq^FbG(}A->SqkMPU}tRrnFa0U`8EPL1&>T-q?_U9TP_V zewW}jtL_^Y}~^3$&>T}pLv zRlhM_*BtYhg00?y^r2CEGV$Cr;vl#aspII;Sc3ZG+e z(CLCDPL{;Ju#lc%aX8Ilh>9d!#I0(d`&S$opTY8N?7>YRVNeO7JOK*Lb*zZZQ?-hozQiI>L zjD$~@y{j$unYO3V(9&~2{Jcx?O6ja|eQw@hP4T>uvI#{>C3Y4o(cD(ywGR$D{B^B; zFET_#|b=nVqp02(h7g+-`P=!%MNx7nX=+`RCjLSb^zxo(E)XnrwQ99jBT${NEotlmy-zUg_&y$ACcn+dI4Ak(S zqas#hwYN@AiG%t1Q!0s{YLOYKd9z96fA8!~J)_paJnG43pO#zp4}cV`zH={rq1n@$t*kH&91VU;5|*hD00igLJHZtx~J1 z@WY%WEUE~q>^C;iB}$<_;@?P}VkBXadCv-|y?%5dD(@K>Y$}?9vFmb%Ud-A{4rX8p zm)A}h(RQt{=$|7(t&zpLjX~_lriuM_)(12)oS&YO_iiCNQK-~UkyVUJ9Weuy`;@|> zLTQDloKHcErMM!XvY&mGA$AB25ua7RMx|9%_+SlbJGIwO#Cbh4jq;*0CuhR2TzAF) zzPs`f`GSMQJYNg>Bj%waGe)}VuABj8p~mDBEA$BJ915IDyX;=O zE1G}GRk7F9e7<}T0E(epN2Jgcd1XS_&X-Wn?%cv4?^e$`N`5AjKv z);Pg;4`sspY$O_)bEt^?b$UtQ7l~mzpG)ASp3||F0SByg2=1QTv6sv0s70hBi2;TP zxEo=;@6EdOOF;OSda_zdJBV0)5bQVI%btU{l}?e&R?|;D(`(P)eYnHK786a#OeFCi zT7m6isrup_Aci&Dtr`(Etb)IMsa3-krDLn|)s>W7`5Fmd;$Us0TuLA@D6)k?xtK&? zQREQ#S37N6hjnRl#}Q@$9M%=RPDsQk|2y)2^ZJrSBb{iaQ|=`ZnC(X_upp++u+zts7wAk7%ThQ4FKR|CJEmOa?|b@{ zs~4QK02`@}ffoR>7#@EoGZODhv#S|=aZ1wb6Nd26&_!s#X#?OW;jG}#0urH7aAvsL%TI|h znA_U1(A@LOtFE6Zq|`PbOMU`ap{z7@*nJ5xhNXNZxf73ku<6?0(LTlP0pkx|8`@b_Ie;f zozpI0Hw<=B{{<@rsJ34S#Xbp*l`A=2*YnRWtIcxFmpe+KBpE0`NctQD-IQQ!**7J1 zDg`=3UhhUH8Rxr6xhazC8oSr2c2oZ{d#fdm%9hF?WUgz~|5*kl$wn`|LL=oQXZ?XL z=d=S0zgcwnpECK@k|iwzO-ZL@+~n9wd>o%(a&z2*Nv@XHLo*zmyg3}4A07DA`Ru@p zpHH-+6&MF1B%;fJ&NKwm`;!;s}Ig`RR1$ZXJ!D96X8W`K9oWu&*z zd}7QagCDlL+il<{pyD#BGFFEpG$s8SBClBFAsH*@Y_p%>nnJn-4J0-nf6Sm-a`OerdEJCZt7 z?%T$DDD{7OXG(C83+%XNM@P)?>6*SZ;sQ7R#3yHblzyTJgx4`M=_+-(cME4T7CP#g z`P?b#9(eW#w(w34>Mid~EL+0;jzcibJAa!*uW8_3jRfnF0P&i(m2U&Ynt}&*0XSv$ z+AFn;^l^&iWrxK`0A#qW1<4J$Q#a-UbA&!O2Q8=Q{-HCr>or|Y)&9H1a-~6ZqoP@e z>qsv2pzcS=?Zdoiv=3?s|MTI`4zRhlP5&&X->M5;NZg(RH z-dfG*y@vles2uIszmB!NY+bkA43w8w?hUNic?7;|QvOdSb`;v|u zn+>HXcuG`i3HK$Lb#rc`v9J7PV-Z}m63?F&B zk0rjZHE91trEP`i~S2VLG%+kvvak0)@9ZT929^RU^ko#`6c zQ2fs3ynN>Shhd)zOe(*D-!Xu|)#n9Y&>Y^JTH0kjsnUMDRYy5(Bj+YNj zd|wYk)4G(^o!hAL-c1@4SQpO5L)p3@yu;)`4%WInJd_7WgghODCp`o&KG6IrNb?V% zaJ`{apFiY+TVYW5)8yAQt^X69i~dt$Cc->ysS8`NkX;vq4?OhM4|WHM*;BX2j6*iK zck6orr-JMN^6B_wXG!{t<2avo94^p%Z57AM6K>2{nF0z0mZjmb5H5eFs#B=ow_x-+ zchYf+lVc#c2;2a75kF#}AM#X!0FGl6I)a>c2-yjj9LAC6PKHXE>+zD*lpHRW55n{DaU1IL2a zT=WZT*wP5#`-Go$?L&;?Lsg;WJrKLQB~T7or;-$BPb%OVZo)wI7--u0_e!b83a+~D zG1Sftx$ZV$Nza~s9_xNF7P7!At$A~_@rV+V=opA0!D=d?liD%ZF2(`^AW2wA-Xic% z7f?v1f^5NP`9Ul9YHX)_(Ex}+nI*N5?YH#2Zh=3?}(cMR}QI_MCZ0hS9u z%VvVXNDav{2bOA2z{BHar63%O!Tw#|qBq&cbm}`xU~-=BcPPC55g7Iy>9bOH2z5dY zCU8*Nfdh!9IU)`fRzrF`=@Tr(+?^);cYiu#Z@G+^c~pGvCKkFM`0WnH5B+RBr3Utr zjz8*j?|x24L#pXZir?eAr*IIpYhIv?umdNyqm)x4|BL+Fhwq&RKqlOK0KmVZ@a}8x zrQH9An@#ra28RMcaOBLHyyEt#I}&!WfUr3QGyu-GmPNor5ra&B72t_Chn2Chn{2+D z<2T{VlTv@Y>=WUTRS!&htS=9GUz07?Dqqw?1-VyVx%{oI z(|_qpetEJ99w7XVhkn11lKqsn7Ip+2ybK2$fq?n36r(stC!^U6PvE8EF~AkdvY$$+ z$3fL3FO=+3{<aU?x_{`A?tBLhnR6BlXGe;c~~`SKY-r27g@ zd1Im=mV6U2%JOo^on$RyBY%n}`FLV=Zo!5!@KMl>m4156el$uD$2!;GXovI2Xs~6G zH|rMqPBP3#E6lmM!HT0npw#(-&bd5wI4^fa^=Y8Yam2gnaVdjno?%DcX1=Roq5gkGRY{Adn~*n!OMmj0Pcd~!uuHJe67WUG(?GuO zg8wEec5~ZGH;MQLU{hzb&!5dgSIi+a%N9AyD+MNZrBagA;l*_GkQ<*s-kczl7yA+* z1?cUl6Ndg12|sB>MyL|J$>a?vLSkJHp^>zTYD&v6QR7~*W6~>@zlhwkH$+B4GjrRY zH1Yj6)=`KVg0Dd(+UA_d|Fazn^a;75++q^f_#Cw?_1Ea95jR?$U1_HX42h^Up<0Pm zUPrmihJWXpT{-gl$=#T!fkH#@0OfXIYFjya2Rq%h6&HJ>(>_R=P+BLo#o>!QUv`SI!==-oGU=B{mt!6Y zFt{rB^FS@kWs{#wE}QpEE-kPMXCq2y+oT2Zyeaq?vTdDu9TFDZMQ7hQ z%XtWMAD-QK7MP(LkBAdek#E2K3{mraMC9cpojft@NtQU}<7lN7!sqV2L}PydpZ z&tyGHAMv~lam#7t(rk^Nm%`yO)ZD{RG4139(rtd49F}N8b-};qbVA;0ku^SA18r+- zhqihpuHUJx?fdw;ORt0lYIR7k5&Vp$s|*AcX8|MZ;mWr?$_(qTl|jQtCL*el$h4M* ziKYK@>R=l#LgHuS|CL9X-rlfi{ZwQ$&c8h8GEkQ?w~HfTNrxq5?@Ar9EI1%_6*sl$ z?2cv~(p=I53oIi!wyuz+hzXdKzP50adlSG9{Au}WnAO<@EBqwXmhP$L>|s(-(uXo#JJ~q1j18nPxxG>pV`2<-hIk`J1U!1qIFh zD!YlXm{gXH%}$a?$(1Yv|Gk;h@9G&#sA2d>!>4<9mE7@GZPfUJ+xw+g)|Xkg=M2Q3 zaKC!4?G~p*qW@od`_}*v?=6~SQVb_*dAq_hMgoyEoSoHT#VkC z@n2Qh?(PHrJGU9nny=p(Sx zUkg_ZzuPeR_rJ&RLh3Aj?4Ek!RmI>8J*w!h@h8sY$8SOD&;}hC#|Ba=S{aqQ}j!N-DcRB`M!`$%UQR;>Et)B%k104PK|8)uErLqqJrr}*9l?wYEC&=V~5Wd@U^ z$Fa~)G0-Cb0gWBOB^punhbtY7LiJZV5arDuF=)nB)NywQXAA|x7)Cv-)hZbGr7}1H zF6iF8zc%l9Rvp%78R>?SX}Bn>#lOQ-QH@Vbog92*$2f>5W%YP;NzGJ3TULWsl&vNQ z00lK9rSgc9`roUS2d3^%BIpMOCoRrXo!4>Qg%@`n@lgLn zy(x|j|K@a#4ISt}OoYP+jL39kz&zMx_u3Ldxg+K-I&#+%h%{CqP>4?s9M(=iY&@`{ z`N*tXmvs+)`t{%Td{f9h1%_3A>yTnxozl$8P8rtKA?4hUQ4gL?;9O@CnH6Uf7}vQ3 z>rmH{%{LkIQBfw!Ot$wm#(o6 z?}T~0qMLcgYTb8lex z;pOH%h(?m}+&F)`SmTHc9+@0=1^seL=_wq4(@S42bkPdCa)0jloW=g< zsYc-sjN#qKvZ<+sxyq`OT|$XK>SAk_3RQ`oO-OtiW2#sLsCBG47-*Z%Tf9=D5MGx1 zx?r#HIR<(kIsc|=(!F@l`|@J&-1(IKTu^k47mR)#*E)+=C)0!Rf3j+OYHPTIN4A8* zejkR)G?WL;1H@bm?;}OBeH2_q$@VP%6HSIajt$!v(_LCDlGK8M!s?0wpLw7=T~8Ft z>?IF^Khj*8uTj2>fi@7484SrTj%-aL^If3D?{^IJJNNPR@XeT!uN~xXU`%qQgRKba zn=9-X*fwNUt`>3bzS>r$zPrM4!ew7(C8Gg@;vZ&=-H1u*C0$GZ#?SddAo{^8{YD$A zdP33&mS*K2(^8fZW-rtDvU_~tn+;qGzvI!%|-~H;qNGixj6U?z8 zK;FINS*t*ja8n+@P0(dKcl)XBubtjLXRB!L>!)6ydu$%sL@Hx00Zl{b?l2j1veRiu z?OpmTa~P zaqVr4<2GnK%Vc+LC?M13;HUL^^qPoWPu!y`|C?6p)hFM#$qRfq4b#ue!#FO2+$qMr z!fz-<`UC12nlBL7_Y)?6D=A={l)gpv`V(OBZQ-|tTjINN3%jnIJd+|z{3=%Ln{ZK4 z)gc60R=Wjv<~X!^VO`LqHF(_%Q3dv(LzXznuG0zYzaD$s z>rwgkkn;p@^_(__L&D7-K$m7Rh+=L|KgokdV8ySF@BH7TbS{;6xc&Ma(M7athGO{wI5uLzPsdcC*9A&;#GLv5-kYzhyf?F!Jc^D}Bh+>rM^G}k?&wc($C%J|% z%qpcd*Q0jSOZ=9zPR7$1ziSyPX2$RwfJxI?&u1Tkg(Bz>8#Yu63^A+KR`|O4%=#0F z7U^qjF}oQ(%sLN=gz$Nmbe77Sh^#>2;g8Nt`*~6Ca^@o#k2)RH9C+jMIO`xe3g>^S zfQL!Zz-$KnT}Z>Q;?vVJLmmVj9)D8h&Dmy^cU0M(<|>W4){cd-61M$)zVdWYK)hA$ z_cCF!t>U7vfm>QL; z89~%P&5 z0`B>>c45D-5*IyY^3f{w0ZnhU$zrQ=CWcF00eahp-kuF$)t zhr_9V(EYjP;UGi)&u=&*sFqTri%ZzrbHjbW=H?A|TK-jC|h`POMLCi5+z7J}Q&cJ=m_(BiRkE(8tM! zK2^~te}VMMLE`@f#2<(SKbo&zj<@Z6ZtTuS_m4wREKTzp3XVetR3fQ+u>D-p4X-c) zZSYeSc~S?3`UhD*u>QVvp1Je6+X(L;@uAofZOTw^93eo*By|tApA(Gm3gOU(DXJ2h z7)}njult7~XxJZc4~;n8fgz`JDByPv4?#d&`GBQWT(6hMVsgDYAy>t9`WRm=bb-J) z7#naK*}>rK(qwSX>=582)u)00Oc)t!n%##;o9d&cN?P5Ac&7P38W}@|$AdO8z1vLp zMB=(yA3Lg;9%kA{lBUTe3j^L;JtM&Yd`MXSA5N_YvC(qJQho5IJQCe zb=&Cy!CI#50llfOQznt5WgsW>p9!dJuy1LP&D{j&HdJR9UxOknOo6Jj zmm#&dCb1Z&KW7j+jj&qz4mwp)QdHIRX$DnaD3Be`>JJ$PYpqK1K(CRSU>I7e&FYg@ zbB+bmGm(Z*2*I3PGmaMLxr;|g{V49h*{lkqo((z5FzYsEMB(lv8RdkS{j>&~bUQqU zTx{k1Yem@O#h4WYBxLmi_a=Qc(oCzgEM!zhph{`qiJJl|PsYpKig~)|PtpQ$PsYI+ zCF5ja@g$N5Dv;+2Xyf`mjuk=4^5{`@;S)$@ul5q~k=J)-r*W|$1xp4T2Qu<7e)^g1PMGDUgh)AI`*xb2QNn9%lbr%PU^?QX2!_TjsBT(@)2 zLH^JG`$cWK*w^n$%RbCzE)@M+p~2)GN&8g6+w6N2GmUhwkU@qp4V_adVg%ITN2pv} z^ru27?Gc;_B^V{+WMT0n!UF`oa|N_k}C2hXN;w$)eX|5y2(jo zOlyX&>Jn7SpaBpXRecdyD*J|{!F>toZu6Q~E*x3d2w z7VMutagVzRAc&oERZja|gdeA3W-PlGkQyi>nJ78ZIi5ysVIe*5tATO9bcefJ4ui+; z=3Pk|G!FgjlmgY<^=~^Mb9cTzkRiXHotEbuzh3&P!0gCaML@9;%=^rB$U=S|Ai9t# zJw*GMe}}J7y&oE1d|SP=uXlQ7+S>2BwgZajE0ag}txjEgq;vaYj{4bvh%7PwE3AKw zrAzPB4bK~{2RZsXXHy-QW&AfQs7wJijTZ#w2QPTPKE`~&V#NN~lJ`L3f|aTH`1jS& z1?{GP4Zec>j%6vB%%3ZZJ6r{ZM?Nvw|8Gh&r`}pmnF5!e$+zj|IFeP*FxX7O1N>oxoF1?lxPy3zJNyd+gu3K!ME_ZcCtUjXYb2AN z|Hhx_1(WOWOBUFj>&hb_9p0K4+(w1ncVwSRvVd8*RKp(fSFY+qU5>7JjL zFy(2hbajWBX%iSpM%n~sIIwvlH5F7`zvz1PhMAza*wEUS)^EGmw01@H z1It-5i#(;hRpT#ec`zzeYolUmK=q4hU$#Zzip>ROEJ3|gS}$OE3UuigewMaMJNrPH z0I~GKzKQFcTNA}RgcGmsf4pUPiZP(O&Awql>3vL1BdxYyP@As@8pL&rdv<4 z2S0pyqm4nueYGj=2Zh}$s>`3Y_DI+E!u)@U?=DI^>fi1rtM@Ctw~PO7I`Cp&1^d7J z95rIf+B#q({jZH93SN-+hD|!rDRTJp$_seH3EbO=ELOl)e8gV*SNGC_D&HYnzhaUN zMhT2u|Mj3rlvo$$A^*Kv{zlKW%&>k-05e}z)8gn(&P%>{d$MZAdlkQa|29Eqygq5s zv-9U*767jV+cpGDBu>Bc{1&HQ9D?(#dKuJ;b6-om480rPf4aWDyBxR^UQX6ylpq>o zc~jYfXAQk`dK)P(ctoWEvpYeCe_L90CVt(5iD%TFjAJ|SsJde5ow~t!gZ133`PGTM zHB)K8jwk60y?7?P+Q1!}Qs4T$>Up7G{@cgZlt$kS*Wqu~WdJgjD>_;O6$4c>C3D3! zbx<-#BA-Mw^cK>+YaDiOosKHoiQd{Gng>*lxH9T$$RklEJM}o zXD{s7_0unYo`F38N(VRs4zgdorW7V+r5piKlss6lb!enu%`bN6axXjg+Egw@VjL_X zKvujZ@rf~o;a=Eb`n>Gr#4wFNdA|}3!yFX<#aOnA-O5R*zKYX;;Y?hoA~DWO2nh@C zykvmE<=^lrR6MBwZ~OYOF{S8i1EE{H#*KvJX-53@egn4Li^Ooe2Z!Mx`^9SwgP!b| z9Y_~P4;E}48YyU;p6*_DPVGJVNZtFyv(KA+V!Vv#wp@CzoN{-t9!P+3fOQbRRRb9# zHX;~^{o=J~;72k|n5q}4$T+|dILLnXinXvj8K2VUtDdMQ>B%pPQ$SU8%_iDeBCFbM zyp%LtMvTjhZsJmoB7uelY-2B5;RJgD+u18tlbjIUD^5e~1`^-8Io+}!cJ$wa2$>sb zJ`P+5{v)x?DP~}rll-=RnTjtW|AJ4!dd#%6)zfvWw3=VH>vr8KohFri;wyG~d=={w zbhqw)ljlty-LL!gpdQr2dYCO@xgf+Pcsx7UvDf6#8cs^G*ckC~gs1a#EJoXfrJ*lSWbc`Er0;qAQu zC1(YJk3H-`B{I2^ZLm$!Ng|!;&e`+w|LNd2YJa=s0Q=YjOQ4)4-J2YRys?~8vJ*-m zUO-HErfkNa{{DuP>njK_KS z*ddxZSyr{%c$wUA88Id^x`>k;K?&wBAO(Ba0tc2XASrv;A`ZK!ita_pSj7_PhJDpC zYzqW{Hi0yN+w7Z#TR)J}%aeWGszdvy!cNPb=KRB~3k0yKfa#Mv@^CKWlC$ySvtd72 z5*`cU*vrrY0nS%I9-Qrn$zm_X9t>GnC6kh6Abgkr`_o{R7VMia7lYCiu#Uev7||$A zsoBciM^;bu@G7ypjRqb39jKfUR*QRp$1UKX3>y@ce5foT$7dWQDn>t*5lVX(2s&ScuP$iY-1L!GkStA_!&LL=lB9&@-updulN~$PA~8UzQQ;B%y>y-*G{j-On#EEsp@V{!$lTJ zOjUKm?DEYp|21d+rvF5`{Mfwr(W<7$>@c}d ze_Jpf)_==SNs}quUYqd=S7P~Tl^=4rFSrjpweIu$apNq{IetGA6oqqQ_5a0}K(jZ& z9MNG%9e2`cXPsx|+PvCV^xdWJ;tJ7gtU3F~;%Rb1_67MTH?8LLAMiHM8hdrToaYUG zW<>gPt&+b=|G$6bzkfbj^1jmgE9G0mZqDd`)fut>Jydy`ZNBe)h6shU@85m!Uwre; zZ3h71qx<^#Eq}{t7`uSe2^-*o*8t^^IfRaqQij_1{t-m@YrC|ftM{=Z8 zlQE?-Y^bo9rwg$+w=bemEm2%Pmz244qk|azI$OVcKZUE2o_(|p7WrCiL`!dZ$5}zA zCH6|5jgf(<7c5>oe?w{YtL$p3mws}xRF6$86(2@rG|tT}Y6ayiL(XbwX$)!^Jm8qS zAKfoom&5Z@AsmgO!-#spN<$)yMTb>x%chLS2+CaiwL#d?(h|B}4_IO4b8y*I_j5Nd*N!SQY{-RUw3qf2Pl1@bD?>5>-id*z z?S}bK**y)SmW72?{zTFn+F%GpHrEUU>&r#UP>m2mLC-66Te}f?5=a&5iis79@#WBK zEgOhn5zMKX)(ki{lVEa{o4M<0`A0GHVr|ogB%Udizme=9BD=L3@bJuz;RajCDK0|4 zBQO1-lb?t}h2H=r~F2{oT1#brf+AvZH zMSzXC33x*Yk=zLImj)Ul>{WcrC=>(oAh3QD!9razBTDh`3BUnX{#e9t@lE#{Wo1o= z4mA8G_~IxbT#6s&5PPouP~uuiOw&)r+x|j&kz@FA#A-4WFg}yUNFBnkDv1 z=39(XOo05|oFRPJZ0$D8Ua#0u*qI55#wy2Vn9TYNl+LKOT-#`m8~Rgc|7>foAjBwh zme6MdmC6IC#Azlb>gQVrX*dhYYR_`&OlGBb8l;%m%`nN18e58>bi!u6k>)9T>c;JA z#t@*{O3di138~QvcSlYVGcwF5I`>F2E%q^p+24}D40^{v0B+tBrl%(}ba`&YqhLm? zumyerU940jerlPUH5;ojIY z5f03@yd*n;`5+d0pe>*}Suns{g{QROti)25<2~vHh%nOhgoSBoiz2JW63w+M9Pe3c zc13nf)J73!o8sH46+3*ax$ParY0eB?qGo3?pt9mEU|UGfB7qAQc7=fPI|#~WP_Cr3 zg`CC?q`}M|5ey*Uhvsr+#r@m%p5G|(@J9ck&XCXG;GvL(HRE`XINzg~Kcj&icWy+n zu;}t503HYAltdd>K}qW3viiOM0RLPeig=5rSLOPj2Ep!s;gKd;!ZQCgpI#3d|IXbN zx-v|Ge>YvU^?;|7Z=s95JuMNgr&kQ^vQPEG?+C$vxSEhn4J-FaqiN z#SyZ}Tx0huZ|XJUawi|ms+NN9zPihSreiCTLL$393oUw3jZ4cc^S#47kaT5(Z0r7!bMnVyEDe{EyL}GQBuVAg#X-s6R)lOF9w8g2XFFo zu-DP?7%K?(y0D4-(zDQi%c~jFj)X=K?$tB!J@kluYrP_p*zZU_?1I%OFFRq~exyvG zqe2m@E%d{DPuA^m_vE+?JIY(DkdtkGPG}9Gd9!ejuOWIY4Ay~v!Unj z1DL@Qpf&!sTbMfCfFN4YGXD+2rMm0}G76fYzeS!~TxP8;_IuYcXCWK(w=I|LCEI%- zg0K{o*qE-|ijEMmdjIVzKNzG?KsBulFvS6RnkWTfL|o3*+`ppgd8y;(;WT_k*kF#@ zu{@eX+4RZT?fT}j(YJ^#Y0KLxH`dm-jUPN2#mu>b&B67Mc*s3896Apphwvf3UqGjz zg=il-iEcpmpeLf=$v|i1WiT=%8HNlvqa>pyqa$M^V|vEoj5QhCF<1-{!^X%lCX5FY z$JAlEFwZc*q5wUCosInfr^SuOO~K8^y@q>^`%3_YUyXkqzZc&TC^o0`qV&VkLfe1X z^0s-~21^97Y)CdIJ0*LM?2ODx<{QYJe7ki2^ZW1=-izZFp(e-2V&=qkyrDv5ARfMwyeD^O-A{&zXO*D6Al>oYl_6?|>~1*e2l&1vGaae6t!{!M?xpYZ4X6+iF)4>WM$dU1of z3~mB9jho9Y=GOD%cp{#XcRO@}ze#|^`vi8uDZv#%k6={Y3I9SEEQ}L@)J3nNL*g27 zlekBsAu&j%N|Gdbl1d3n(kB^@?Zq;&T1@O{htP47`bfj1Olgj^T-q${k!i|`WiA<0 z4i|!jl$y7$y{dWB+ z{Xd3c!4NpD(ex@TsacbGr1ur2E?x2!B{k9D8*y7hNk ziLK907g*AD+c(>Pbm$#39A}-y&i7P$#(BYc1@7khwetn!g(6TX)Ce7cK7g)4_n~i~ z-&h&AAO6|Z@4A}mp6i9X!addfsV7{ds`Rvae)f)ezw*@-5A6=$h;O=YvF}6Q%a5Rb zi@(f2)xV+OcL(|d{}csZExsDEGJltZUExi||3yZMe~DH)cSir1Re~sOFZm?K$#+TY zkGM5{F8*y|H1SPRkQ_{&Nd8;ODs`7GEu)paFN<)uc7_InFX)B$T=PK`4 zepC5dRZ11UiY(whw3Stss`skSR9&k2v|3!PuZF54)m6p3M+)vb{wu1P3RH~S+1qBe zwXOIMAt6YlZTYrp+f7PiCubM78#*l5Pqd#W-%@e9!*Fpc{l<~cBYn)?<5=PNkoJ*h zlDSUUpQD^ooeG_5oH$N{PSflmJ7g`U7U?ok=S9vf&OgdlmsFQE@nKgd*ROS%Tfcq* zp!9jqSTVzO44v?f8u@VJJRLp{_fP%(mCnxGqz>ijDAnc z;AGs-L^9t&RbmNW)aTZ}XdpGjHVie2HbMnBxdt}gZ2ZwApA9wH zP79*nY~nU;G+%F~HMchZQ&Ee`&dQcimIf=pa$qH}>evG81pA|YmUinv>s0Gk4#9yr z9-JHwm$Tj`*cNO{YFliVY4^4JwU@Wgwg2s)I+7hx9dn&howGaNbXj%vbn({6!pz^D z(EYeat!GNlJo|U!FJ;N&DFmI{_?euT|~zyB(H{q|qKHk@_$`sv=^zBJNz@6g}h`S)+#D!w=VX7cvKe|-FQ`0eTQqksN( zbnfEQfBpFbwab4sUjCqVfAv4^|NMMn=<3d2OgTjwlh_2A001(92&4$!J`GOKgV7mq z<{Te%jP6jGkjgAEvwO#WW`xgt5Cmx4%F@R9)Lc;Y52tsXW1An32*QUiY(7sq{(fhV zMUPdZz{Kxg`3f{}#1Gn-lEEpgxo%7VxMh9WCune;m{>rg0^-Mwzn@}FwxOxGiz$E*JX~79rLrYb|7d4qmmgarkxQ4EUb-Fe8a2==B)F> z&^0{zz!vbS*2_Z*HG)#B$wIgABZUfv-n(kI+T`QLU1H4>$p*k{{$dV@DzPqjuQMD; zARnJ|O>nhAX)z4(P71VJD2F(3-%d&ue$VM{xU`c*WzGjQEG^XsDj|W>?%whMt|aQ3 zX|$OR0=l%cJ(Tx$b&wedJ4H?njo$O%MVOkiO6G;sdAIo3+ng4P%qr|Un+HKAJ6Wo16U67TJG1% z-DHTPwbIZsK2}!LJheZDd(!&=pg?4|I^?g@C*9n=XeP3jtE0E*zWP-|Ny&v6!h82f z{KW@ZrG{Has2~0t16>^iD35*~K#sH^Cg%N&Pf7QWRb^r)4*oYPOtcirdRj@<4$VW- z0^)9oC%!0VRV*6oW!0l@{Yn_C+{K++;=Q3onJ=kaC=;3tB91zNG`(uHsvnJYQT1qE zzY@m0ySPiRrz+e4rK+oux}0c?xJDCh_1f9v>wOtWb1^C0tX34?Gd-*W0Abfhb9ZB^ zCe06rvhFxIDFU`wuDu*=HoZMj1e!l@f*CecLOq}AiX_rt>fiF;k%8)sL;@yKcJ=yA zd7ta;5<-WkU}X^)xL&Fq?l7lEw}r<&y{d^(WuePxO8pc&yY37s$e*zA!#n(`f78v( z3sCdb(L4M=EA2DqVvpau$MP@DsNvSJ(tFCljZjW;=bfU+qR^CMOEVP8!7}N;5TiC; zy<{a((CtanP!HoCE6#agFo1i!>1zu*7=dzf!MFA6mW_^N@9~@V$v9`Kn(fC;C0m0) z;oR-y;x|17hwFFxy?$3#9^cr{O=IZZMx`N8){>)iXPikZ9c9&NG+G@Al7vd;&j#c2 z2*cQIeU(55QvmzQbF?lIy)0;ecu0`jy~pe>`@PP4*?uey_Nyf>p>M0b_J_q@@X7E| z_a1m-%Xm>gYRnJ@O|_<+Ce+<1Sex?QY~LRP4&HyS_(epQ33Z9@a1{@XrQH=PCDhfI z$+cSg6LMaEGJ4d#rx7p#<3sf)E5Pj>&prv+VGED=ykpRhZmd^xaA57dcLxHBY$3}5 zPzNkugexhQKzEo=i@kV$rvb{m@GCwl1RTWNJU5^J#Nq*u9(llkWGa;YmhTs1G}Je2 zIvfUTo`jwY0I-X$9A&Gp&3YzgkJeSx0I~X`PaF}SvMt?_E5-r)_j}sdah?dc zS=K2Cn7qKCo#E-R&vR(MQR$+g7d-vVR#8XOnW6cE0GqiJm7!Fp79Xmmp~}(emEY`X zK^2c}P&5-uB70xqFa_1AO`R(Yt&UEgJ*Tm{K!G4D1-(i381Yf?0c$6l<=u1$O>uB5 zN`$>^@9MIi?8(h)m<`)QRx`GdQ|%`PtpvTuX{_7AjwrqKZ{2`|!*d4;RPT9!gW=Fg zrrRm$Ky`kr<$gZC=KurEVJx|Q`}#ZH0pbZRwmwhi=;PkBsb_EHclBL4Qx$P1S{9l? z0+Ouwicfnvk_2lg6at)nU3k~0xQG{JIMi|w$CKrJ{?sh+7+w{4?Yvl7RiudzU;@)r zOFGJh0Ylu{%Lj>k#R3$1oCdTL)hdf;c9Brf3t$_3;G6Of3bZ9vy2q?=how6*-xRsp zt0s;$^3p|Yv|MT1F-&rH0!GHc|oKPhXt-?$uy0OChGUwGH z@}?TQe#ap4V-|g=&;QkFJWGlXjI4^gvbTl<4&TXspohJDnTy+y%{lMZg{y$MNB?le zUllj-D^d&4zVaN{CBl}45QOWb70apMuF=WzkR2ojuGx7L)ibgRzRe5_=&ju+M04YN zQ77D}7QHU1^er1T?e;h`9jU0i<0KmV8EOKO;^{;Ef4ykU$rAv7c^F4 zkkkm0xDFm@<5|Cxk}KA3G1t9rei#6@tLz3e$P<1mab6_3=|RZfJ)ez+zOd-3#c88L zSPp?n*G5TbkP2u!uTCNt652MA4%3mV5>=>qH!~p<3s@)41nuaT(q@Tm$x+3>q}W7s zK`vLl?$Kf!p~cA0A_?-NoEIA*&%`_{BabO%9Pm;>M8F{ITf z7^?#pKTeM^o`Wp(z?1Ogii9wX$+2HqPZ9F4Oehf#S|Z}2M$MT7wcj>L30X}7wsXBf z2b zR(!fH`;JXR4M&}*Vw-W%Sx*qDpb~!qaZ+b8Kg@41O$q2M=xE|LRv`=d+D~5{8 zYEU(kco^n$ol))2faRQA5Mb~j0z1Jjog~(;p#GZ%`gY&iZv}SxaeU9#E!(tDzgbp{ zWQ{O+^Y9*qd8DIj*%9MeOK} zjf$OTInkS=QQ0|j#+9EaDXHaGd-Kn@TJ7>ejZL=Su5~M<@UYAZxe%zqj&ZJKBtim; zyAVI`aX)n{oRjLl`$%prkGlPSPiU$VvQB!uiny`t^(VFlgyLF;MI4vei9_`D*$X#T zQe25IcW0mWFE207g*JLDs1py5fhMY1^pK=dh8oRWi)6zC&~a_S^T8z4lo0Xu$EGZ) z*;OU?N9#}H?FXT(cGcXhtgNe_`-PRAzmZ{PUg^QoC*HjEBG7M{pK&!vnRI_)l8H>0JbQeZXSO_~(YJEHgKTLn~iGp&rQ)?aWqsN$-+AE8$ zFuvGI2`jpB9ZTgHDVYsG0WJLyH!W94Lm84Z7ly2Ps*|P6D;_df$5bkC)rLn3e_68P z1(=*6l};sGsr*5&Nu)948Pb%<;l3ikKbTcyZIbZBcl~(R4Nqqfen}2_)ZSdd_fU{( zs!dEY(ED@}O_#-IuErD;Crb!=@a}6`~1=A|gguLn*H6!wMCUKZud&o-F!Z2zfM+a#~aKap?+1tEMOq!P{ zOI^3#Wwm~Ny%Q{z!${FWHZj(^Sg0Q{DkVn=+YvZ(6i>6a5yKDq4zfT_a-+wgF7$zy zVs-5O(Q6~NE|%6fAokTG!<|oO7Va%6A93?tV|LF0m3?6vAdvxST^?fLT51VZODNQ| zFhBdoXtl`dOWl{d2xnFtRy$5_T9oaYjrz56SG|F`d*3N5duNS{pr>jQR)sC&&V9*1 ztTT2sW6Ao*f>VG3veUrJ(s~>sb_?+8XfmYvQb^~{E3WXDINYkLQWLNNCm^d=ts$4? zqq|eeYdw=VpiOuo2k;xC3B{w0LMvy^tNy^g;R+9=bGvq*UBAXgruN@kRT?j0;lK-V z*b07{_`OaTgmQ`^)_D;AHX=QKv+ zJiC}$Ws}TKk4qHCTys-(FoLcc+YZROT-^3lK7+ zE*kR2K$ZR?|BXJ{CuTE#EcqG`I{92Gul5Gpky=s#bby3 zs&w0ZY3XzU8W=B$Jd_t^h$ZRRnmqVDAImW z$xOJ6z}m0GxQhP;C|6HHL5cnqut}fTfBe;$RR6u073GYK+2s4*h)(0js&F5)X+aAK zY|y@K@J1Nedv7OdwX&}Je&E>+3OZtHhngE)7uG7Z6CeZG6!0Q*HnVB+}{Od#a3?IR3YIf6`qy_Pb6~%q% ztOH1DcnwbX0^I6Io%VwMy4JO9+;xu7JE(IZK5b}FZ-&CWrW`3YiA3zS`ykqfI^Gb| zBjOkEwPYu`?GmYZcRy`tP;0*$?D*k_uusiiiZpW;S#H>&cunzMz+vNn;iACFl~7zF z;uAEXxN`^cF~UMefemSTaGPibF!1^X*B3?JQH!MwlQNVgDj^WpF7f<(0$X~qvN!cA zEErgV0VO2KRcQEXRH7jrd-31KdJ_aeE*DD%9PucA2^GF8>M zasW7Mg4Eowa!QDt@>0iYg^B21i@QG`S=~r_+IQTX<+q^>a0Ef%&Zd!Vd#ew-lXS zCPwW5cuC;b+AF5rPIWdb+wBrLka;drF%L%_4F<`=R^N?@7+yvP%vUN)Z7(^V0X z(J1RPwqD}2DcS?$Vt*$&slwQxx(b?tIMC7*mhCilCWajr!)qPdwAr%L-828ZfF|h*}MsvZX$YV8iu|JE1*_!j!e^H`&PfM*uNA4LuBQ1 zLGo^2gM_5>=Pk+heD2}9&L!OT0UgULms}brjb1l1u-9a}TE(U7&TR*uh%s?FhXFR)f zZz*TV+1!Af2fMC&c> z5KRX>4yt0SayR3a*ONe3o_Y$e*$jkk0q;qZ%q`U=s89z_z#tKO%L;}Q1V(ez#uMS_ z*aoS<)dC-ntnR`~i_l4zPF%;9D+AA;vwhAE2C|<@1gxpdLj|`}N`yb`vwj>q)kL6K zqLHrrRy$m*gaPg`R#JtwlDxYMwtBq4HH5IB)2w06wk}(OsOT1QHIco(crVZ(jov+R z|HrtZf^P;vlm%Z(E`eCbx3UOO#$coDg_5nCf-bky1VjOFB}$ujl-xYFnvpd&8+c@>r-W599nRJEbXdM%9%+Kv-oJ*pwIeOWk#6^3rW3Wq9p zX)Q0L1#0I;;Rf}qxFp9{Che61HEmYUZxw|K>2hHk!~$~+2_N`zn^sv08VT$uolp%?P+VCtutqonp-oKCQ9b0b~>Q@JnlBxQWgo+Qc+|OTn@W~8FN9_k+X_w z8UnUqlztmQHrVuxn5cLaU=eCAVHlk3YANtQuGuw47tHI1wKa#jYM0KavE7OGd@r_> zNOX=Q^z89v5mJgY2c7Qs411VVSf(E3Z&9aNH|Ez-5Wf$T z-tY7fs!au0;WXuj5}Z;RuT5C^pm;9@VTo-tg_%X=7lIP2_DQc5w5LJW4WmxQfQA{> zY2I6>IRn>jKYYW@kF%jEZ>!cwNl?lByxwj>t9B>h>Z*c{u4*p9UTl(Ux(+m9NgwYQw*j_ZUg)Z4r2ZVD7 zw>g=#pPwKNRH(yu=6CO|Yeswa|8fS8HE{LanaA{ATlB)CKOsZWgc1#>=(rR($F}BzEy)p6Yh~R2lLbeKYjm=q`;p{bg{DExcpbj3CU;Qi# zIj|))8v3RKA)yiVg9PMx7=)7)8~D6Jj_X2D5lYa4BTUF3o_PJDr1k-JhKZ}I+G?Iw zpShlATTy6(nws-MmQ-^(1h#~Srsb9u_F^$t6p&lF>h&NrHyROHThoAJ-w3;*BpQT4gIUEFNXa%2Zu2*Cf@ z2veO)RSXeEtN}vc>mw5pH07ul+Uo+nCIpXnUoDQjhv#K4H{b=U9?@OEy&DfN`Kw}M zM;iX`V_nlWJYUNdxg^INdKUth`Z={+<4CH!N84sBbUfx@gPk1(Ic}nid(t$cz?PV* z@Q0G!w_ZE!W`;pmFf-p9v;x%2O1En3qDna49gyPdyHWTG;pZb>3Rf6UxFIeM9gxQo z&vEb@(}-v(tgG>-_l@M*fArWU!^;_d>c3uIoP}9&O>0|APF^`KK>J>Y94cN{%$g&2 z91L-sbfWGfS?Jlu`IlAfC{}5^5qepRA@$!%`y5ui2GLC&xzwb^n`XCtDB+hH^!q&B z`Vu14VBhYDX`xsm9;vH{{{MBYjt+KH%&zYi2T?X0JGL?mI?J^u7IPFAz*MW09J0j= zofM2xv)XU}>TmJSPM`U!@~xdKd%)=0D;E^kPsyRnA3qgcl*74H z=RB@w7neON8vB(Td44X~#(H?bMW5KI#ved|jW+?vNBH`5e#`C64P`obHPPp%HrsqW z!@_o{4&kW4bD#RE66s)~|`OUJ`Hj4O%4QEpcv6>x|4_Nt^2G%sRDvx$=?|HSm zyf%$;V;7RLJ?v-_8f&y0?q z)0es>Ei#)bN`m#`{d=Ldx*?@Jbv(!QL(ewU;A38Vy6>ebt5(k9k!GqpNogjkmg%Hs z^YFPcdUG1lFZA2n8(e5#RMFuQYaB9cyW+v_vfr&x2Ln*XOcC%@N~CdVD;O*T?dj|Tv$H-Y`TC2$Y8dNmPS>N5 z2ssY29L4b$16+9O$b#39$agOUla-+g4Jk0xs#OoghGZ3gOREGm9i}Y-(A9VchDl zfNC)A#{DqNH^_0kFy2(}vnVymMU4?5uy}U)C?=G7x5Z3*cnDOk!#BMyJTR0*X<5Pt zd+hq4Ii!wa@qWpl3NnT3#O4`R3|ImTAug@r03Tb47YSFOxo873q2bC1%^|UwP$c;Y z+v#SnATDjJ>t$TYn6I|GnRv&oK*e&PJFiupPH zTpDWBQ^O7m_eMY0`LV95Mn=ZEN8#ef*a5*}&@0n&eIZGP>=rOV^i4pGcpmJGNACi| zeJ>ErYHFj$G6j-4hppF`-;gb0xf=>lVM)<5=ZjSqA6_1~eS}lmJM%kw8*GLv&oiwb zD0A`aAvEh!07-%8$E!z%YPh6r94{ToHq9T+2#=4DrKzoc~69k z?&Fb@%s%+W;1MV13thN+b$C5+na+m&co@M~VGBKb%8dsKf&>sGK}tK20$*w+bxKB5tsY8{MFroB9frN?`2NWO2dUGgwku zFm+z5(U+T!E0{iu_8vrq@^C8{G>$Khv8yAAC;F#U$%LM(h;t3+Wg)aNxEmF=J zrpZ>Dx1*;fpFh{!(fgqNOe(L&Oni_ZIsw+p&h3Y z1sZP^RGT-kYFJZ)ld9{*iS-u+HA?;C<(Oih`Y3?%Qop+>Pn|*ri1l%kPf^ z6U_-M?O}R-N7;cEitq#sQR0txc@D?4YU2{+*3oW1G>R`xLs0x-vJuC-YKr_;*^-$b zB{5T=lJHpJ0bmRko{^=H!2l$BTVrT3K=7w*Qv$NAf{Y`MnH|B9D;rDB&>|JCifywy z*k9#|A`sjh!{+Xa zPt@d0Py=V3_0M#AYwig#r5X<*Y9>XuD0&f=SdZS=AyzUh_a_82Hjjx&5TvEDqmYJG zu1Sg!AVqF2_qCqG_MEoSlqxl3q{3M0K=KYI!sTTdX`qm0O{P9ah9HR|XmuAK^0~xE zBA4px1a0G?%tV(KICN9z&g5 z$qjkiQNtcf;X+4Lv6{9t)0}Uy++~qB>59MrL^3;eUkq~UUHe&bQZI*Ja}<`Oq%>Gf zZw_V`=AAkMG6sLx06@MJX8x8+mFK1jMV+>}-bSFJq$W|%mrs}NlvB>{udkZsP~&mj zf;*^b&@-wOkd{AP?=X4ZuNRx*BPs}_phqw9Uau;Pw-pyg=v*I{0M*fgm4+HLu8-$u zg0;Ng_gR8+pKs{zea=>~ub2CIMK3cirDo0B%24dv{af~(j_>;W@#E}b#qXT|q!aPa zYcIVMqF6is+5KB&1Ny?cvW zCv7C!RorC^i(5?RPs6%(k3ukmt!q5lwe$Z##65% zvx_;=mU9wUmD!)yX>x^qW5#kS6J!CW(6X;zZA+D6EclG4JNww**eQ(I!_S0AnE&4y zWCBekiFFO&U_wVe;ov3)yvF0~`-wcn;XtzO-rTDn1Qnk|yVdkpi_b1&J(gEY8pSmpt_|z zbv-*J%eu}Bu%XFMtTvFf&pE*X90wE68gtG28M_|1frq$X3l3oXngq`wUMhqL=!fXw z99HVC>+fkao4zxt+>{ci(f|W$Gs@(2ZrbIP%~oqOE1V!aBz98(5JyY|M$pA-zfnEC z8}Jf`$27o0&=ZcVn^3?opeUHYdXqPBnNT-KR4s0Y#IdEZFJD4u*n@PsM6WlM@X6+3 z%eEMx*9h+Z(z-`P5Am4kK8dziQN))`K?2ygZUFx5N*Y>BZ8G3d;o-#oW^8W5B@UFsMc~!-R3TgWC7#BdEug z<@>=IrC6cJ4Ws`O(w$c}97Ga9!!R{fchpiCUSpo%ncG=GqrWYg?KokzuUS|+mzK>& z-=s^XlWUdSK-8Ji!x(nOma=Wh1vqQ#z)aKk}Q3K zeYiJ1rg-cSww`Kr#@0ro3`!8@1EA%7()nUNSg8`|wMiL$Lzq>1i$X+c%l08f_wyjy;8Z4Z?YrlJaQp3+a#43!9YSs{3EyGK1k#*P1Z z=+<2id1lJ+vdYxJTFGlaradfl9L#Ak8uYuJ`{vkQkt9405>1r*kaPzh+H**jtz zi$kW->Ydp?|KKH)?5;I?Q1a&R+m?gs3SS=@SLnsPkm~r%oEZ6?F>lfs8Qz9(Y!iiU z?8ljAp$JSOs#9R{^`tFjNrn=-)`i7S`&nmP1&Q-S!oJDA>F=Xsz{-$ zv_)|=x2n00j^H7}iHc$2#qBJ2Y5*=+RY6X2nl{OfId^0CnMYGKNCAXEU@{jO;lOi_ z=Tvt%j?TLUf}pNzW_nCrNQH!4ulc%Qq_|eqOByO)`#Rk154C!^RdI86I%f{N+6-y1 zyf#c(6#7|N!)Mq8Jl~-wTt4u$Bj?mQhR7B|A~j4Wo)Ze~haEitB0maLVS*==k;MU9 z_dIwBrY7z}Vvxx+z(O^yiUPUX(2g-mRROVSdNE~U87z}q+Z4rKt)e@eU>GQoyDN)b zv$U11gD`{$i8lBcRGvn>yNIJDV~;h}M5GO-%E zoF=xx)A3@7OztTc5%!0CcJn8dLk7Ed3uF?JT5sgfKsvcnCE~JY;tAI9#i>$Nl(>_U z_pjRJ9R88BIjBmJR)kqnGIYCswCDd}!|e94C1UAsl-%$F2{~2D+isz$o{d{Pq$;Xs zptEwZ$DQlZd=%grNAFEfx8%kix zDkts1#NU(a>{RmpcW=4XFilxeHttZH4A?z0)iuC6?{(-@vH{t{?Z)+BSgDk<+V!Xx zd5WLb8bZ4)(Bbfmv8#FqYwbyEs1pPrFeMtT%c%r}JSoNUSN#82`{C%s@Otg*wdhD} zD0F%*2UR@!PUJA*Z-r;Ftr|$W8r<5@Mfa^raU}Aw$2lI^R$?l0HL?;kK_JA&;M(cQ z-9i{lB*Vd;J&J3>=Z593{d(wV_=h`I5c^l_NN8iD3Y@h2C%j%cv9-^t2vkhj`leQj z|DXGRCmuOlEoIhJzY@G|hRZ+bF8e>P$I^#wu61!^|>Z~KhE!&mkV{Trv`y3D#Zj; zKRP79G|kW!wc6~k^7a+CcDgv5V-0_WM{&jyQx!WEgT>ihgt`ifOPj1z#UIP;h!E?u{29DkBjV?AfeNEi^;de7 z8oPZ$)C!R~!zcv7f?~J*wkIS3!H3?5<~6e|ST<-tJ+*a580MChV~9{#=bhxt$NGT> zjQ06<+3x>8wDwPU<9)UH)<-u)6FDFfkzn;pO#%PTAMFLS@-O1~(4kN8qf5F}eBud4 zY}W$%(MY?|d&*YGXAX3h&7{x&ZEoQZOaNzK02W{ngy5vK!1Rw><*}K!?%LI~e(ltu zMQeey^B$~$>Iidofz!)Ehx2ggB`vH^pk1qe6i_cM?%oBPQpGJUp;;%<+TE7R)6Dj1 zDE+8_plGRoEvRMmaPmk;aDnUgVII}_{RMjLcGtpKt(~e*`Kj27ie*u4!Y;cb-M*;R z`aB{C)0uqC!vq3e?1X$gApQhtmxMZfil5rZ#T`CnKZHtmTr?lP!&8NFy=C&$Ppv?@+YI!!Q)e4U)=Aka6N* zIp}O}i_xNpb6hEf?-gS#b^E}~Xa2MUR?leVzhp;D@|{e6w%l>EtBXW0`}Xh3jZN3y z^^QdS)yiInzF(mI*`_7f1oV&PfoBc}6>O}*{3MIH7?hgh01gfCx{it6zlJSNx78cIT zJtHr-@%q*2>r>HMNh0_863KWXt|ROgR)WhU%_+gekK7opjBz%i6#saJHpvVnLlJI^ ztiTxwLR7kUX@H^F<$NwxwS;)%z^7(8L}?*zAZHwQI|BilpHdGFiJA$95gw_WISsq4 z`dKYia7Ct!8%hliRk@)RHK#jn0@!#Pdt@?Ip~8Zt_7Fk2xj|k(akN`A;H?iNbf(RK z<}qnHXx(*)x0h!jR=Zphb#QO-{=NE}%Yw8EEXpaY1754?K=vc*6XV3A54(|A%OyjX zPZZG_=ZFxN^|NxEGZLjV+Bo(TN5BLRhPtr>$0tQU&GIxQ@3zmG4$pHuUmliYm52Ry zjH#kj!ANde!_D~?j9I)Lq*tqJNawEFLy0-Oym2Rx0qfL~>CESldfhVatMchWm)kE~ z&Cu7x4+dv#yc1_7Fx>)@&n$3i5wbDE1ey0$>2N46($jv!wVi0x&_^t9rj2!wFD>&$ z{;0L9aG0o{ECsL?d|~2M$S-m3`Qa~N?ZejEIms4de)r6@{!`!fe zaVC5dVTz+=<5Zny>LTRAP4%L0XVD%bArilXf!sU3>ve@KbUv5(WA&j*o@P7Y*h6wl z8m{)F8jVT+`q?!yX!ZN6yV{2IR(?#2>HryxNm@pS);>P64>rf@96Ouf!NZ^j+&Nj6 zJ`Uv2m%4f=OUH9f==`m5_pwZm?05PnGq)_k>Sis@;|gI9B;VbrY?(OC*&4J=l<_N! zc6tY!J>{sptKkUEU69Ul3QdPE7DxPnpbLn)c7B&=y>GA z(aZiJGK}lRD}(>WAOc#7?)wMP?DFzMXFil<{OkZc={=^A5RrSO7ZU1e*GKavT6Y%W zz#JAfy5Cv2leKB+j1mnVzk%;$NDYM8x>kA%9a3A9xc1&{;H4N~8Iu|2D)1H05)3qq zyb}+$tqodaROw~S20o?7>LA=$8}$|zmX_|NsRwpL&q_6k7^hVfj#_S=9RHb_?kifX z3}so4wRDBIP*?3mX&9~CQ1hs_u#671C;er;aIf~(>L=ZMh#5PzTe)sDS}ZHSFj#TVGqRo)Fo!p*NX&!R=-hocpnnMR6_G=O8y|qQt$ldcMGvQ zf$yB;R_$hV{puMVl(0Ed@V9T*zRbEaN#Qqsc^n<8%PmE!?`6F#azGX~^h1cWU!wOt&m};SMH8_v z)y&MnmZ|9BO`7x64`p|thTCb`@ZTZAv;(6f?8PzHsJI*4lzve;Jo2^NYN+h!PB}?W zpUV<0st}3&jzn|8M3WKfwwGf=joyL1_9}m`UY^2A2xWDsR#I@~ooVMcW){2sfrVzfe)Q_651zf5G9FaS zmPx8wiW17&E**(R1pBf9X`cy!9>F@Ywi*2%%Hs9 zSBtZ)}hR*z1F|^#jErJTU8DSQSZtEW9 zxxcR0=ic-`ZKNHb2yoE!C){Ttyr43Gg_C_zk5qu{#fRjukBc6~lTo6Vo5Ev&LL#`BePny`c zI zR9xay#2;t|&%@Y2X=Ze)!f?z8&9PD033x*_!c{5{K z&E^~y&Lq0stN|aqci?#qMLCUuW?ZgF>|Lm#%!6G-H~~|=Xrr4p$xXoA^mWTNs+_{P zp(&pQJGO^@XlaVrhOLZ{Q?N`-_?4nh;fP}ymJrVf41L?y6{#NJEAe!F1f^w2Gwd1w z5@@+gfB%B{k(uo;@{nk{abMKj{C{feTY@$*ec4$2I{8ZqOFsGDZLbF^Ke~e`KU})H z7mTvi27YEgGM%F6-`*$(>g~U*es|s#MKejT?+zy5xsX5F`OzIu>pJu1P5c85RG`iP z6X2)NzFWU)oJ`-p5^t9J2Qqhe`jj{0-BLBiA0T%11FQLV`*Yn;Rf9BQuB`Eb_(L4{ zr_gSAFU}=%>55nwn*7^&;`zQ^9Smod78-B$KOa&sHT!)CZRc&g19iiZzuekmQoP=a z+aL5xQy}OH1o{Z64e#b{EQ_@yTL^>xAaPwk9q)Fi?=;uMgR9Ef%fD&p2pQdLsyLvA zV5-X_;4BS&F)DVH6oo*cnW1*(=y_Uc1b`}2w_LDIuu9c(STF5sabJ4eAN2oH)AoP< ztt;2=JNxpcYo1daEiLjLrUi(3sFu8hhQq$A4}qbgFmbZnYZ>=j0mDJ^QoRESakm#v zzx%2^Z@q&BF@0X_6Wsb7qPm+%;Uw{BC9KPjo-wdNZ!TG z9~}J7{ON%&o~{4Y;fGkZ{?*#6cHoQ-w5vZ|s}1$5d$h_M^u7vLP30gdpvaIPxilHN z?RQTTj4Y;vbdwMY1B3 zbnA?JcxyVSx8UsWTTeY=w(q_b|I!8F+~2&PiXK!x)YcyXzsJdi$4595_pQgRb^WQx>6But$`Iz|G2E}UYw_*tj`;h-IOr~x zZl;*vQ!}Oa4iOq^c5n8NWwQ+}qP5RD$(0L5B^@QhPz5iQt@JJ0b148!VnQ~d5#*ng zWN>*XO1F5fveGfVDvk=k>#9QM5(4CE!w4ww=b-L7d}Cqp;S-4~0C-ET^5)Kf!@k{V zUp(;HY-LaaaPWQDMbEyADr{ibyiWWunUxZ_!cxc{>G+GwuODXuCYayu`j8XwqQEk5 zOPbta;V67t7Vkb1B^*cNwCH+aB%#(GZ@NIlH*M(%ucRVPYK$bs9>aa97)WsV4-a(# zziFGvcCgU53{5j^n*ui1?6Q?4t^Pa}nAp!aWBJ|}F5VvW1Nis^nT`plDZ`!MNu`=(eB$|#yy zUS2#Yf_sB9HCEQ_sv~vU)6#iaiYj_!5Q#9<{TA;Sr!BG3nn5SRP!2+0QMVE^=2{kE4=Y5QGT@59PTTbqe?HP0)ohC`Z!Z_uN*pf3-PohhulG3&_jw zL5z5r9(VHH{eWJsVS13-RV^%YG|zxDRT)!D1>TO{z!CU(VKmpi>@ zy?$Srf_m<@E7p|+MtxIsz%*KdrKmr@{jO_SageCDl-{B_cJ`w`_|ea3h0p@tbB|pa zDuH|kY9Y;-W%*z~Dn9Kmj$dvF$V)<~J?nw|ut+xh{=Dv)B^;gEV?>$>P z!(ndv5#STP1!PV^5j-%w?IYg{RXC4zP|_EVQzhW`3g z?Zu8JM@fEYJH#y{6dGx6D3TE5e@C%Ph9LQM0yX6WsMDPY&)>>+s&H(EnLXd{PhV@bFmpj(u-H3E-9zc2b> zrYg*wxc=kY!!Ks$2vBV)3cZ%D&H9EB^j>SwDLq8Ye|G4=hUxK@4N5{pMhF8al>%QN zubPSI=|hwE9K|Chi3BP=V}4bBTMZ56!y{ES=;+?C++x=Z6jb7vf7rEicdDX|*y{HL zs3TSJ&w=M#vAUfHVPFAn=AT#Jbj_y44k{!>#$-#ptsMtiK_c#2XX|pa>f!j^S3>S! zDvVKzV+c;O>+3{3LO{HDRMT(>Mh1?T^!jmhN!sOzZF$W-UNblC>wNRN{B75doZr7U zjm);Z=8YtY#Hvr0?CV(Q#sMw~OcA2bMq=q{`b14E`BNvy^Y!3@#t{sPP7!OJXV};0 z=Mdv3|NOv*8*HusY)24Hp=-D62o%>$dy)+%{q9?X@p$5Vatt9;ccLI3FDGRISM!9D zdcm}kVX(H!SKgmqd-f+;Nj*!m$W{sX5vWkJy*!p9x|pt;&^J!~rNHo;?W?P*bC}ea znS}Ke+6dZv`a;QxAuh3M%k|#idwRU4+6Sq!Ib_SIm@~4}-p){Ubo`=$5E-kLSA@$c zWzyHa>?&2rreICo41pVJ8i5N+BB!8pEcR*7PGToR53 z1YR)8)7Y0xi|LdRP_#O+3@aPhmaxT$jl>Pd(DoR4aG&H9QjQGM0a9yym=8`?#Kmgo ziZ(egyb5=h7@mbuEp=;q&H}4dCu5J~#kwl^w}T4mH0!p5a5eO@pQw%~ebkN?CRwM` zO`Zm}6}tc=T2-ln%;gL8tmTbOJ7qj*Yj3BWQc*?@io_^F=UtD6Ly<}dx%Um<6g&CK zZ%Yk=Fj-gKx7}Kp>&%4~vhH@~vPX6>jVUJfi!?eA1wmBUp?A97y`oK<8kJB>jdj^5 zbc|aIrXxU6Z0oI)MwGHJiCToVXoJLRV%-hg22aC;NhdG+5nDJrR7p-MLYWX!qBZd| z{bXa>>2tH5hO4r-9$Z5w7bLI4>nc%`{ldh-sUk35D8jJ87C`_N+!=zg&>T;v$a;5210vj$>Cou@0n9wdm@5oKlhLh`kcoo_LLO~@hY~rP0(u?kD!?|O5 z=-|kSW~eG`>|S*&Y)dnHIR@hzMWz}Utuq=Q4RrESC#A}SN*7l7AhxZLU8UV{TtY}@ zE{FtKrVL*8WrtPDE)QjdI-fv0xJmk{Ua>~)+@%j}p$am{j)Et~(h@P-GcsB&_g7^H z-R-Qwd*iaAUi3l#31ATFuCn)RR0De^+8mzB&lf%M^=SpivJ&s6cm%92XyWyrF&nr} zAJoL;^=SoTvw~oPTVtgZaLebUtCPw z@xm=Gqc1aczrV~d!Wl7fm^1%&3ike~WQp}`wDwpbM?XTX{4+zdqM=&F4i=P|1pndp zyjrWV51}5;X~Ko?mW|~;COD$B`dwWa*9`1WN~}Mb6V|-8&xC| z6@g=ITwVk|9%FX6(p{!F>q@pGo+yD$X8>xJP2J4MjgAXy2Y&w$9e6gC*Utsf+OLzh zkT`i~*1jUo1=9JLFPZ_|1zZU|^1x`dRIVc`5Mms4+v^19=>P-3OaOEwq6=eoo2m9N9ML4 zM1vvnNom|2rp*=);yCK}i(-YdH~qUVs`4Si^@6-oErGa1s8U+1OkQ$rLl=hXM2sL( z@vOLC%0M7B3fkJwXpP11Tur+Y-3${xhqktC*2T!y&~iBN_Y8Aip?UMeA1*~8wPo=}(%bX+WN z8=YjCs`$mhb!R24a%_2Z&^8PdipwQ|&}NM;(UKclv@24dR`@70ra>=UbSFXV#!kH9 zOgg{p9$%I3g*m8-5GAg*%nI5-RAP-)C1-2*%Z{j}H#@uSBw8K7+A zw=HQ)P%{$xy$i+JQ7N##HFgwib?XR?vP;+0?Xt9xP-yU8Tc~9^>0HRSn0;ZQVx@y% zyMH)(9jRS;WCTqaCxi$sHQ(Ec>8-mOFfTWbjI=AIuAll%AjDlS#ws!VDZ0kAXHxJw^B$>lP8 z&)dOEUpfD$Ya@zazdP=Inr9<=>xpepN+W}W@<{!zBd*3hGO~|}kL>H`_ZP?gI4))v z5TN<|O3jysSUaaW+X%j^9sIO_qmsACXm4kzyL|==4~^3wDO7+4$=$1LdB%DC$y0AwYXDRHj^Z#z8k$lW&2j7lFt9z`*m!Z5_z@Qe@U93td(Ev%`P-v z7<~p*_^E4Z;ro?O`<<0;)jz^_$;riqx+g;GhEtT?WETtdPxtNnfZW0(p~l{T5-4g8YVnwxK1jjF=0Epb-_1X`h*?oclG zdvsGPsy3a+57O|^MH(nAGc{ez!DxBAI0I$TLS?K;D8XphvYdmEcuoMSrWuB!p=O9+ zr;>|?U<;pT3eu`nGVm(o8@zNq0f4#Q52%m(LJODEkbdEr5_3EpmjcHPVSGi_cj@`) zf=RhtR7F+!_*dol0bYSwOGR1qSyh_?s@e>w%hcH3JvNQV8@y!p8kLS}&a%)p8n3Qu z_2{)-Bi$N5n4KLBb3R*l0IG9xFPW|!00sV%Zv`)OR~X6(=v4g;r?SIHzb?3P5!l=^ z7V1NeeMGXNtt?@1)fGgMH=2xegUGdDQNOAHH$ce0%*;_`Ap@RSXo%=L+sjxcOF+Wf zu|$p~_DE>q?Nm&WSIdG_M51%o4RvDFkDKXb7+*Dm(0}#-8ocM zvEG;)318uplBTUqose%yP;e0mc)=(_o!hd!U}3+@bVQ-kl~L6Y9@>ui@xs8y(y&yH zZQnJmX0nsGmY^G-G19PzYeV$*+)TenbUOQuMJ!S?vp?~Crp{-x`1;-Dqv`7t@$QnF zUDCo$whPitm7+K|0>E=sRl1rvj$|3VGEg17Afb_2AP@vXa7%6oc=aPp0E(!LLMoKx!WwWD3FQ(bp80W!3VeSnRc_CZTMI@4M2T1 z?)Ui$yl5mo>`rmPkV;n52LwB&t*Y2!);EN&veU9`@**DY@uS)OX(aT6AiY4?kL%9c z>0B2(nhl-3?412R&3Nxn)s5tk6*Y(D@vgHcL8%;pFTZe;iN2YNdozr|^|QAKG>bQY zvWy=Nh7HP8bZR@UYasxB)67GT3SCMQ@e|jscz$HEE+=1BmD?K92$>IbF75a{=NPNNXlDpOeOLJLg%q{nn+ z=*5~_0&QojSD^A;D{@@F%6X%TH4Z$fYNa*kVU>?=8t!(jtYd;_eVI--#5R;JFjG=x zn4)0gtuW5gFw~e^Xh!u`R|Ec(FNs{dS~bCx3FTzcbMQJUD+S>J+|E6rDHy71k7G)h z7K6O>kqx@920WVTk2|fV?4lWS5z^@6qRZz(6|Ll13VEn+69A0wgeukk4kLP2X}z6b za84L^6n4|8QV_%1b$lp%XAEIeX+$0xmJSpNM|4{>~~BbLRYH!caZlrGqclSU{X-k}sV;hp1-A`>x`k=yz5XZCOrD(WDSW$jjN z;Vu5$aF$OjD#61zq408@eCdK^^#~B$x>+B8pQE>1A%VcamDmiHCLjw|vJnz80}|j# z7~hy^P22KQk#}19K217*XtYDZLq#*UECZncC!Sj+Bn`5(4YV9ucPx2l5Nw2UG_mFL#?mWH>R~NZ@Y)$kyh4e;(ENTm$(@oAhRe+ zxS*xp4K;lgl}+=oA_Nw)DRXps;n?6%`b0Om(n;fDg5TSYS!{*12=Puw_ybpmd@Bjr zF*&;(=;m>L0zXaj+>kABm@>Cbkt=UdTayejdm4=q%Y)4l!(`F0U<>#OE8;$Nl|nCs z9KvU}G+q|zNcKad1RC1%<|FSD_YSr(c7)q7))#$QXI?WD6rtYdHa^Aoch%7yJSq!z zwgfM_GZ^&Hy(JmdsY=c^YB^NhmvPrAJP#VJEz3GxO6}Cz9;lq51c+o|tKlR`*=}kZ z0SW_&_^Pook732czO@fF^aZXtXofOTbY(`&ue_9>DP5VHZ#!^w8Goe5q+^kH3 zksxs=Suaj9#qNkRaB{K6fU-e|Rhd2sPNxz~N3F|;purABk88Yq9Zd8|HT%x-3^=O<;-?bX(+mE=J|bD9W#X3b1fHj}H+ zjyu={Z)X>G?fJO&q!UQ|<;<`%m@EZGZFin4Osb_+0v8w;GwN4=pjEGfK0k?N#{qzj zJ5)?J^7=uWRTLaJ*D+~^u7Ljj)(Pee$~amjS4e%}Am8TvFfDOgA=VQT2l zJ&w5R1##qg_m^``zFHZ`R3}b$!vsrV33800d&E~U46AHZXRc3d1<6u?`P`wb5o{%B zJc;#F?9NN%Fg`)@mlBQVZs;i9kFOM^_(k@{IW#UGYA^m)@Lv}~Mg=mK_mD+A*0Cdx z4va-sH2amJ=y6cxE~i09)E~(*G;K$D6YYVw)?yBK6@?*5JTm?zlDIKytyJ2;H&-m? zVLTbU2vY{^LV4eNCw67THQLsPnz%lIxr^sLL343z#*w7CQIcYjOX%-~D-m=pd zK*Ad^pUBRPWYaCXUUbqv4G#$wHgKIYogMWp#}cZDmh54*z1Dy1><3Q`m7_Uo(jI9T zWjZQ}@A-adEX~pu#NS|r2_WL6ta%=FRI~{Xq&LKHhCWBAm_@o;<`|gvxWAEe_&odJ(?dDVb~eZ!Nh$?1Qv>K5zr~m z<6w+Zi8`!wS@++by)%9ORQH~5{`rmfvuy2W>mOKNG&k^%HVz={#3*@#MiHDnvywPs zC#zh`ESXzjuKwoD$Pju8$lE7N^LF6&mmknHQEAsS3;B|?H!k2-8w+%{wXhKcI|mmZ zW-AQmN*KGQKTy2LMwYjO2DXLPF~|87@yB=|`vYbW<3(MS9y?WY3v3s2_Kv_hh2FyM z5}$}2V_*VizqJ43^(R!d^X7HBDeUgG-gS+|F7>2BoFEdT=%_xSbgw}NhwAa;gJCzY zEWgu}cpRT7GQA_iMp*Zr*%q8_@fw^FPkTFyJIBpC;hz6?ypLlgPlE{Htu|>>3fFxv z-*P|dJ>~AZ1{7O#SO@<+7rGWXd?A0(xy?HI#lfa3_Y?S*`>=xsd*mj0C0CT4=$Y`q z6w3xf;}RwW^nfe5b>o4yVOv&^wx~%|Xb1TRB0p}E_Y>jl-4@yi0V0x7zik8J798lR@N9nEm=peQm@A1RIxTe`V@5lDUoX0kj66wTa;nR#f@ zy0hu@^*_QMM&qkh> zXv_pBMGm5dVzkzvZGB7@!a4Hk!fqNf zRIBYMvm9x?6uRX0nprnC3{zHGZw+17ww`Fg1Z81*W|^%L2#~ZWRo7R>XvvG7YQk`F zrM2zluE0Z(#XeO6tj2K|CAmrE)QmwBRJ+dYdi4TR6J(+@XkPFTbW&rR2XNE2OpgYc zdBhpz-K47L^|uxyS7f@*QK(V~R*!wpN0l&GHEg`abWqd8Rrt0Iw)y$C*T%MSHl zQeZ;%x)f@j3%xGWEWVA*hDqy$hxI&gyk^Y z*g?2|SkQ-OXZ&|mQjy=$vGld{%(ly#;@@6s{u4^0=NfhxTK5YgN`+&?T>9WDaNNmi zknEHAQJN__ux~fS#HXr~<>_YNo3M55Y~ZJHm{3 zD!B<&npfs5cZr+%NfKJFxegY10}ljIfQQonGI2N6qN?kb3kYSFjy=!cwS&C8CX`vR zo`Kww2=b1-9@FM@=w(p-K3KJqPK|GRtYq?;Q{>8l8T2Ag`-t7-U@>pI5qHd zrM)#x_+C;PZ@Yuap^FfNlRUTPQACkYfjlqq(%v-7eBsS+<>LeXmbAK~aZvbMtL+d7y|1Rg?ao|1rWPbl2maw3) zl^~cBx07=>%dlbsfR@#gkpuziBW>MH&NIB_trVHPhkLGL($#Wp$U$#KY1L}$9h$(< zU|asgC|AO-Um`m>3f5Z*y)0Yr&;&$gw&hP=;mEKxV34~eoLNoxsv8UjeS6*RoXB*W z=0`Ds$PBiP7mL+241be?Y1PC!-u1mG4zy6Kd(8BZ;gm!vdXIw~xNOUHy__@+L;QCF z+CWlj%9^r^E*w$5Vfj1c)oVJekpX;3K-h6Oijxj+`PDzQ+YDh1dQK!fztTK^VSa_zQV(1YkXYF93A7~t zhPW_EZJ`}Gn|U`TXOlD{^K@$mAV`RiXrT89^!w6ld6Tu0zN6vkD|n-#q>uA-YZ0u` z#1=x6f%6;B41?C#mnAWZP5Y8KuGZspI$sU6{~bPBROhQ>W;}T%F0Av_Mw@&5hvYh? zG`Jp_t{Z!$=u$ToH$#9{CvsJNi|$uKjT2Q)qYl~$sQVK_qWe{O-+rKNR?f_=KHTo* z7%-5e;g9gAp8z2D=e{;!tE0No05$xfeCMXW67=%FE1q|*RKFRxUz;$!gy&%F5Ggdh zMG=G$VGIau(~@pYF$tXu@9bR{-#@;p)mzs|%G1${Jij$JKQo+_UR@Iyx8B@Fwhp09P z@OFx%sW1kpDO;^78!S6Uz9O>mzde{ff|25JVFZ73@!ll;^YTgF_*wnp^0tdqFDPpc z5az9z3dv+H?Y;@~Zf&fYl8#S^YNw+vGEuQVco}H@Q`3<@n3pQ<%73C(rMy3RR$eJS zR&flre%HRIwCkV?QMd7-MmKk({ zC6O02MI3s&i3diRM=XI|xYDw&=thtlu{3m1J1#7d z1Qb!1YXg-+>Wa%96~d?;n|_+aBvIGwgo$TS$*jA?`;?jb{o*l14+fkZm1Q@_s15G$eU-5A1CcM?RvA* z*O3xnEUx8=Q>x{DF(8I*G!lUq*~PmNy$Zxh0F}Nc;d+ z_&chKB}xe81mjf~(Bh4Jc6NSwsgl`Gbe%Kk@+d1hM!gBrzU|Z-mq0~WK`2~sUMris znBXBXZfp<1TD3`qR$;now4AmXi`-m0P?!@!x_0RUH?RELm5vpBCW!!=^R>E7F1Kta zHjb$wkIL05T3kKryMEcW2N;#);fNMv5Ojt?J25tAf_cDiq&+myRTW@hcL%{TZeutwi zRcO_65~67i6}|iN{mKQ0LruBN)9y`p!?ltUBvRhgZsbLm?5Hqq5_La%g>-nYy+R(m zDa*xrEp{a5f&~VTG*&LeKU|(Icbu&6M2*uhwubt9MpOF^{;?mgalRFw@7E3FzwZ*>89`4(4wn6B8ho&Y z?(@X$dYyYvKrs1@A=xXzM8hGzc)%P9+-AxK)hwXbS<*P;o|htwBSg@5I{*)y>xNh z82RN!`{mBveh1Pu@f)T;9L~%ZKkOa@2TG$q_EyNMR2wOYur`duT$D=@l+JTXwPRjh zWK;sESdoAET3y;C2wO&*5b*p>uZ+AiY-nVQ#C6iv(&GOA-1}0nv0cj@XXdS@K+AHV zf6d^9{}sFx`S#fl4_)T6n&hQa1L@R3oIxH6O}ow)bH~mVwk(VO#MOu~DunH3XEdw? zCzxD%2ZRzP&;lky7bVS&sp;BylJ`<=)czu!t8WcilJx)>2Oq0M`u!fUPz!|Rg6+6?G;_pJY_|J&wkA;h)Jh69H(+=9Jp%*96`^@ zL6t~qnmZF~$07z+H=0*=r^(O^vr`Y-AxK)CbZ844mXsi*rrkr6B+FM^PY?o^wxxO< zQXMFcC#k8oQgC=}kM(#hsi8-_TK0}PZV2u5rVWmwWg0kl6SRS*Fmi1>swIx)on%}z z1}*_fx^cqcuE$lB!Zp)%v`e34o%pyK`R5Y!z98AO(18WI??+~A=Hj=r^89H}!uaT- zl6(?nu8%5~*7PZjCr~j%MIUrG{-B4sv%I;zLj!4Up74ie+`H3q*1A+6nJ^Pe>1U0b ziO587eL3univ}JUijDR`vm;awNB~w!RV2rc3Y+&a!82752A$OD@*+^#9RPQGb4$$H zdC|cSl78}JLat1c?Qdmk@V=iXz9Nm!x3XpFeXJvT2!G1+?*02o{Uim-x^DV~4iV@? znU=n=3TXVgmE5|DUGy7TRzhxFLd-&@<2GDu$yd9j%**#7l1SDx4raCqfo~r9u;&Mw z{jAYyC>Iea1fjU-%2s(PbrN}6u#P&U$l^ioFW1IkvJanhasR^i;rnkO3)Y8V} z`XWlja4NLeS-|8`)<@;7H{_+k+S&D`?;bwxk**xg4fMO{<3o6LP%0s6*894-pM<;H zeo5Qc?}QT~+=u{>SmbCFgoi1}68|F{5CC;bW7&j+IcgP5KadF0eb2zrt z4`xSU?M3UVv4p6}Ev7dfKa|sKTs?T*AvLD@^;K8Y4Kb5A2}AkqcW=9DIx`WqKE`d0 zQy8@7guM`&;_0yzOnkF2wbCTGGmX&VPH`3zm6D5*cIHFE;2yDBpEvm%*$9rmFW^nk z7xcot)g1!}MQSqUx4k;v0KviNm|C5XlwRVcIFPB=WXRA^8yQ2;vb zJvv8+x$mTY@DCeW%6a3ha-N+oqnA`0DWA8TP0%!FM8jTuw;gJivwNk2`@Q=AN~^L~ z(dX4;?^?BV82uj=@F{e-LV&{+n*j~zbU1nk$UBdH18CswiX&@0QXz)KIIlWZqhCf= z{=Gh3(ZKV_Hkh+dQT5;71D&~R)$tl_qGH8%^uTP#2~8(*^ZILDq=*XYdyVjmemw7U z6X`e>Gp>0dHAJT2Rt7t#b&GuFKq^MvWtqwwbUt<)8e1u$B9f(WV;C2-XQ;(eUQ|A0NggkUsfURhH19JbsIQp=<=62t#mi-xY{EfA-nh^-ZVlzUG_H z|H}VsoA5Wtkxcf>D_Ia7L>vs9bfly~NG2Z&6=mPB+=Ru3hHG~%(mOFcLbN6jru~n; zsG?po`1YFysEUWd3?~_MfjXV?QhsbrXc~@rnJiVHhNWfg5jmZ|5(aygXpC6!*aXJA zdogIUp8bHc&1hdlXc~3r51XKo(5-ge0C^ot4>rSgBA>_CchEqEj z_N%4OoINorv(no8A;sY}2zgxhQpxHES{% zvZ(&EL>hE@dEol)$!voRd@FzB5l)VWNd}CIEyB{)6A9Q&N4g5BRyK?|#xMlluE&I6 zBnIAC>3qaX$hn=3i3qf19eY|zpeKfGF+;1RwX}PA05`lHIwPX9VruW@@EXkZ zXR-NVn&H?w2rm&Db-aUJKN5x`myNQ#n@7O9S@zj3q@BMQC0U25hmGM{m1KGDVJgAV zY-X@GHZrPMhVdCTA*e7a5N>hMA9l!{%9??zCd@8c7!PnP3f4eo0c=xVtwCwS8bH72 z3CUJ3R)g3zvNva>h>h1wyN$Ebp%m*yzfVLI+&|;@+9hWfz6iV8xyxPDHzfcI3YABuA~sG zii&96xPmeN|6hb{grL3KJVP~sEJ{Y8I-N#lS|zIIhdB|3MoTr^;WO#0Y?%!pLqS)@ zTYBLSZPL$7?~lo#$eY#yWErj%RP$5Bt#MgiZa0IukYP7gadPQKDjYH1sQPR;J&ecU zM&NltN=*Kaqe94(Si|UQp8|d)C$OB?CH__Pe9qlw+>0iWJR32tB%l&6KNkQ3LY1s> z01&hc7llksN*bIEt&`ES()Le}0$62(!S> zrDxCm{{yfv3_v*A-Y8BbPO-7AVr$YVZB}>qh#!ojO&^pnsx)0E*fLox^)5u~<$PK; zm{$nYNJ$UUIvkM!slw`{vppu1(OCFHYOy)K?rZuzJh+OV0#2u3w_qR0z>MzKZarH; zNIc+4Qix5s?&8SR#WCPqmi;Cva6+}pRDpsFN;q@>gX^eWre_Zw69(9fcW1_P^MQ`s z-YJ@pvxNX~{)P^Yf^2ND^?3{ zja6chU2>p?g1iME>@IJrcNjk^xuU}Tmk*kNv%?F|+h#Ff=VN6TE$gYod+v)B7<6eh@sN?}C2~zE& zR-1rOv53c=@v%>fUcc40gW)KmK6|h0HjJFM>y{)zsB+PA3z5YJl)^A31PwzEHle|o ztGik}!7cu**f9M!bJz6hU-{ue6O;5b6-};!mzAR`#*H@4bCpv)1U{QF zfSxf=S)zp@zF1&6;L@mJLd0Di=G}_dIP9XX=_D?tY35zuX5akOvCCGP#d3AjS0UZ4 zF%`^9%RY=L-4z_8aSaK@1#32Mt)UyLO(oWaD<99>j9S*#m_v0=-V z2+cqI^7aRsSB)N1>!`Jw5lo0%!Z$O3!%pt^CU~=UOiadQ1110?=)5WhuaPqn*bS?= zb4wGe9W!=g$Xg|vIxPmE2Mj{>U_CPEqKWrN^39J^r7zkJ8NgWX++68)ZqB~bT3>5l z|Fey49n8xbD_n0JMUfTFf^WN$;hPIbd}KsX9Qw9=nLfk|mW;dCdh@e8A8c$7qv6p? z%xWqA+T6$f?!>8pJrLa>PFZ?20GO1VmkF4blTv{Pok_*YqQU{FQ$sZ%3eO+_mvh^w z8E*#8Tw-gyR!uHil$J3Z?G$5p)~*1m65;Y$ERz^q)uWqpH~0IGSPQi~h(u>sn?_LT zgQg^v#sa`hS&$=BiO@rHvcfIFCrh8Y;29-E_Ys(Jkj-9=6?54lD3CgdAOc|B7$to0 z05W$65@C!A4zIR!&RL@!e`DL32+8QroXQa%F-h?{3=l>K`c{Msaf$B( z17i}D)L>D1lJu=S@8}{a!nE|ZjMk(}hD_p*$3Yq$^J0Ko=gBU%RnX*xB&5 z2!L=!%F9KZf#!f~h8IV+1Gg#1aKJ?sCIU@G6hKrO9*Keqgp7n-^{EI^9DtysIg_EV zwOTQ#>kN zXMz#N<-0Au>x3cqSxm{GMtiCQ)N^`W2)6H!$jG&AE7qtrD!9+M0ZQ5Fr>~o zJ50r(En9+W?bK<+dmkV&Dg~gCCeY4ecnRrm{5fto7+e5qr;dvXm~T9nSd1jFZd+JC z?GcWTGQx~20`eA4N2T^lm7U~bYk?`;3+ROE_a&+bsW>K6ahAa|2BHq&DF84%A%Ovb zJ3sB|CIXwW{1CPyf)LQL48_1s!wRSHT8{fi-95fSoE3(Sxq_gi`n6%g=wdw{TpBY!jJwl64&oXvtkat}2Eh9DpHclgb!r@&(;^?e-oGa0*vaS$;YwE?6DW zAW&f0Z$+ybTTCg_L3zSiB&dKD%s5=jQB{UGW*#P@6mDpEr3|N{ePA3VQHqS6thgx> z%akA(EMXB#vprLUpVROaE~YX;zK4Xh1N_8%PHznZ&D!@p(4h`_5QHfj(l{vf0Cxan z#wszSj}bsLgQ&IYEdTS&RtHFRi6p=?lbudN&8KqE-$iCN``y@NlKs9jXgT(*Su0fY z&!08th4eRF$DVER6KJ76IM5Y-w$UeO0RGvQqdTZxw!;~Pw4Snp-h#n`Q)uwZDnEt#g0)GR+X9|f(An1@XXJSk9mYc9d804I^2<@hYm(s+pKWPAXLAV36BzE#6IiiR^ zwf)2F?qRc}uHIgc+e7DAxd}kL-CDJT%DyiZ`Wil}xFMZOS+qq*-n?bk|rYR)X zu``Yv-vlUI)iFQ80H!4JMYn`1Ergu9oNvFbC_6cr_<;JHR`@K4kC}~BAa!I4`Gd?* zv=7uB;|SGMIe|o3RuP%)aST|)ozSTB-PrMlANZkxMn};|Qrv0rVGu^_#l_6IGb({2 zL@!}bu+(i_Wx^PV?XXMm!gelCK?ugo=USq(Wn1Fj1jmoaauM{6Px9y>8)LA@rEAd5 zeL9Q(1_W65+y^Xc;T9pOwuNR;u*@)OoZN`FND3SEJxU1l2`)4sxmPhMwm2nC$1ngH z+0q@|lh5E=yI$$KJDT>5oObSmpiB0-<1ZJ->8O1t=@u)RLjG2hHs#dp#W=n2#-9Gd z9oz(GWNqKlV&Hw5Il?}sbe|0TU}AUCmO2ZTs~y=EYQ(M~Pos!Q$EHwbH9$I1+NoY* zbAe#@3)1(Mq&7HY(?)XAt_xB%2y#m=?*l!Fvr?tCsRb4Vq*Xg2L_`KPP`-v*r{NML zw6VYLCg-HUDL|b;Cy;++y0$DT7WO1m`!KEJ3?f``aQ%%U$%G87(-uA|1_;BowL=3R z0HXqCwQD|xE=w|kt{C51U>4{Sm(xxCEb>iNQzT%hyhUHMU`4!sDTG8{%_d1m;Fe6H za5o(&sbS0~T5Dr02RcP`O7*pbai{^NEEtp$#q!;I<4b-a*P{~Xh)tzRI#yak7uB(P z8^z2FSAeeDzXbX@W(RJKtCCcTmbcD3g#@+r5_@t?>cQ@ba7rGw*m*o{ye)F|mN)$R zDw&FK6zP316d%eM7fZO%q_IA3v<={eMFvWV#9GU0Mnz?%weJaIk}WBcoRAJ%5mOgd zSa*bT5>>sxR{CDI3D`E~89+wUw5O_yTkt@u#SoIi5XX`vl2e5&!GWOD-UbL;n+qNE zbF{FUhCKqbhz>Zxsv{>taPInp&vTp#ZP-|i$^&;*+uyn9FeEP&LAD$d2}|}#q6Mvm z8BI*vE_{1jL2G}hWKIJ4u<{ITd&GS@6X+09gzSxCR0Fmw@OgyUc`SwP4_)nMX84YoJ^I(kNDW*xj*wX-mN-`#%wJ zI!F`SQjR=pH=mX2SsVPO4H;~8_%G@0`UNb_RoyGB>laX(-@?6Q#&RREE?YLea+t-* z;$(fvjI+e;Y||^|EKU|D`!#_KAV|{z$P#%=1il&4(2?-nBcPz~;2sES(S!pk#(u(% z3_n!+n+F`9vF`p%6Zk)11xh?*1_0Jk3p4=_3+YqdVTO+ap&f<{={!_)9%$V2WFW>6 zAmG+n-Rz)v$61?R9`_CmD>RHYAN1)oYU$(Jp`p@|ozVy=l81m^n7iIRupyP8A`Ujq z{rza4ISh@`NH5$bhw_g1g%lp~8BY)QD&6mYn3Z`+e;R$z-|c?Dd)xuK5jS+} zMhP&&Y>{2*2A(D`jvF*41%0dcM{D?l0@$(We_u8m6(fkkXcql|<#cTPzbhXIyLY&K z06q|vw^u(tbgyxk>m?)*OuJq9UQq^%Fl7FpWrN>8bl+uPYCAh8^y7Qo;0QJdE3X~Q>i5LFFt-OyD*a@%zl0%6WFXPdTVGG9)(vo?_(@w4Ro`G)?) zl2W6&Pm;21IYUa+uMVvXWGCJG+O>Whnt-q5r`6aXtBqrvk2^E=uvanHMB$<3QV|}L z*nXQ1{BPcL)h(2|1Md~~XZ{l9=<^G?!{^=Vs>EI+P9w{#7@cM2N5bi=i8F4kJJB~apT4XbMR+LXub-(F5+#1@zI<6tx@ zi;rc8HycFYFlpKW{~u>VP-18F3Vn0FEhABk^(SJdQ#@amF-(c}V5?Wt6aKwu(;Zg7 zSijZp9xS*kiBDSjPJHUh{pDOnp(5t3SW|YY1Ot*rE-f-1w>G zhgv2o+9@ery+>Of;L@h76VtXhS-cS6@~eG`OAt&*sI5>CDT9XR{gJ+|%0PF+kcXCE zcs!o2LON;-bQ63(m-NfltKC~>Q_o!n)&ei}$`9Rd2A*C!WUWi{p6d{NhS4Uo&vxl&}S8C2H^(h zWhK3j)Tke3r1?y!;3SB64B91vSx-ybsA+0g{id}_yVFG=y?By67YXtUWl}YL%)D@k zToehB1R+~Wkb2KJPIDe+SS{mbV0)?=r_Dz%l-Bv#n_WZ~-bP@D+}!8KGzC2)o%i;L zkOJC1DanRSineAs$eHZCHmGU`s$ur|h2EQ6 zv5O3DE+zb0Hwhe_n-C^s=&jfN%V$vT}QATJtvLUywtbt`tL?~bk!)5=fC(Jc!x*nQ3*L_lX{=@tM?#ZFL0hlY5w%Z}a3_DE$atdLzd0=&gLkr}Kx zdsMN9U%K-=W!7t3r68+z6Z6F;@@2;F|EpU zD?Jd>nujP4jY(7dz*mvt{-`w>;f*{mRJF|w`h7~ghQ6_D4D`IKS zs0cg5w<682>=C?J?{Uj}+iMta8&L#9?WCsEcO(sK`(;(PAj#=FNU+X8>UE@ky1mo# z<7vYtyN9Z?5%cYGB%9i*jmWcZg+4e{oo$#!?*jlgh#xfU>GmB8Cq5QNyN8c&#i_nv zRs{rNdbFOin%ZjJ@O^&Xy!-3hI}}R&wx6u)Ay$f=ja9_%a(_w>rCT|thd2?EoZj9f zQS7w*NXF$sH=T4~lPx$Vo_)1P+KO&k*$nneWL#tRPb$$=|Y``WT zvc@>V+_lw&ng2;!i6lFhHubgsz;8F6N_nJ#VkLoH6&zAn(XQjbQQe9H-OgwLLi{am z{ZMO%@D^{yjR*!+Z1Gmy7?hDqxZi%4%UxcYTmn5OwomvZJOdPa|0yZ43V%eBa%3k@ z4aVVgpiHFgj@;D5*07R6Rn4HNfT;JjGumfX7nfHY*bGBcA(g%QnXd1L+C2ru;ZOJ( zcjRJ{P-YXR3pH9}Z#c@h@I7HsXDx-TM1@p5SLgXt_$t2 z%lfmfSZQvo-6gx7RH?4j3TnD}gG}^K70>@YcTb|%4GqSU#V8iFVD#C{Wc;xZv#pE9 zl#6YrrXPQ$ax5yVSQKD~QK92yV}kJlww|dnfXaSDdeqYm7^q_koMr2}NmfRg_Jj+?+imWmB&&&pvC1IC@J=La63JQ3ZoweQiq}136vj4531fOj$66iJ zR3)LJsH!(6!WOQL1Ig^x+vu2-ED`E@*BN}?9;T_VB?vL!k(r;#UjCHfQ;Hay$dRfe zo%0&)Q#lhwa2UkEoYj`=+Vria>&75v(35MUbilIqsP3)+Hu0YSVh$Wo?Q#1Hv1XI!IB1=olOZQ?6=n|T91NUqy+V%A9gat+E!$1%($WI( zy&f+cFz%cJgcj3L+UaD6oKs9GaY;v$_uug{sD_14AY`;c#-Pqm+>~gfDp}p@e(dW6 zbm`Sfndg^s1+c6WAf;C;rN%G)3N(S&VV;(4&hNGnx{hfW&_fzJ%-)IP>#If+S^H#~ z%uCaG(+^AtM;9_+2O7iXLj++Cg)$|pK_Kg98b%<~oUBMCW{K zW)@07$7yNo160WdDeDAuR8zx53nUy=TSGswcU=G*BWr5I;{s`5tgVfSy&RuCy)pVN z6br2u+5gJMh|#Bt)_*!3#vaSXMth=sf%vHkkbi>wQXh~ztxGsFTM4)DoO>hue)I=V zjTn#a3<0|5-S$Q3;_*lb3dpgBF2-n?)PD^``$$_S`_%*LxNzCUczs-bNA*+TC@KFK zt&?w&jm=QkyGi=ie1MXt5}9x5Sh>UM`VM*>7iBw-FCT#jFb^s2(PMQBV88k$^}KK% zm3XWD1;aNk@;+*@&1gLR+pFiEOz? z=ueG_bY|VIyz-?>^$>+hmkk#k3tb!z9-3&q8zx6ryPtb}tvv3Z67UENhLde>G`Um2 z)rIhskPruAmtIBIZuKAe)qeCHCZO8iy+EIsSG2CqK za$n<7VMH!bH>__Chgw645qaoPxuZf{^yNns$$Z6vI5zc3!nC_{(H$yE?E)s+tO$+M z_ckEiz7!#SS#sr(p5cY^)>v)K(N_#X-{I$Oz}>1r;l-DJRXo)9A=&u86BTWOAJ}P=a-uflDiUdr;Q%ReErp?{1im-P-Nv9-e`FzH(K1K-(Qi~pj=R{`` zGBF)3%Bsk-2)}$`Cu8(y4&eH#P`$*|>po0}DUo%{DUKc*O?@Q27B?an_|}aHIUvvQ zM9lD#CjmWBs*t_;6Gbi4!Je>Vph~%4S2R_rCyS<3b({8l;w>#^$r#G@vEyDWAH#g= zxhtNN8^&8~u}q@!KI32VRwzDQt-!F?FnxK1w!-lT{?|)*x^5W&J3z$0v-}z!-F@Rc z3d!)DnDZV*op(`sa~NJ}=?SygG6gHh6|_1}sP#-FQtwmtshe+qutcvPfj5Qt0dt?o z_ggdiF~2j~^j{R>9}N4fY5vQ-miZ()f4bt^nK33thZ~cw_&$B`A3mzg)M1hrzs(fwOu%D$ztHNG)AF2xkUB= z74JI|NdJqu`mIm1C;vB^?*G5b;=xVPKwfqC z^!Jw8L!WzCf=m-;@jvz9pIz}Ic<#F2=s&;Vefxp3e#4s(O!VKoY!CYOvDI{ET1_7- z+sS9X{005@uYafi`*kAfOd!*PUx8mH*+0JYNAUF3ztMkk?K{Si*>b0-I_|@l!p|&a zsxZ+P#8{sF)z5yx|NZOV+5dW-TpcUhIupg$TU~#RZR!0x36A=;{?_1E+m-O8aio|- z^dd82buvuj;CcN2)W%p&|KFekG7b6c*lfB}wWg1%r{15%FVw(mt%Un<#*WZq4HJEt z1V3l%$SS*AdyEdyjGl-XQkAUJz-zsPuZ8W_Z@JrMbvzY{kJ7|QJyEk7D0Z_`Pzz&J zr4Waaur3Q)2WcD{-p)j#3kV&BUsoU8_4ha5TB<8_j2g8fETPZC%a5{yqUK%1AJ5g_ zEbW*2y1MhnZ|;^g>9+d!C+ME1RVk^DpQ?pPU0)RsxK`Fo^459eq=0=BY{OoK=(i87 zsyfr&TF_Xb4yN*sJA3_To6JGR9ia)vL4>+wJEWTzQh$_T>xXeO)((Pd}_%wEkaKzj-;0&TsDdjPD!iI!rpsxw@< zcPoahz0|9dR?BJK_RbLis9dNGRF{HVY@XNpD#vSmmESdx%I%W+W_y>{HMk_FYj81>4bj%Zcg!zM0G1R3qnbW z`bWqZ1476n%>QVKkm{Y?^TB!jj`Cs^T`v_ly)?V!&|$dkINYZK_$pPjMd-ToA&pk=y&__U`p00)aXsYw z(0`!vp@#1#Ek;jo{^P$ql|yV}JNwwrks$gRk<8nzS{!VZ>PCOOetGJNl!}4eA;Agt zLU)hryBA};Y!BaBPDUc}V&Q*ow1&OE1*xxAa*uTT0ghD&U>)zc0r{B9r?;Ky;cvP| z)_!tBOGjtlWamo(kz0C-O^XA;9~Jw=<6s!&>-hQhZ|_wf(mZM5@HY-lWHq5PB~K z&KA9IcL#61ka1Do)p2=wfBFk~<*8#=kKFp}zk4Fb{-l@~lvAgmgU1S}&G;T8hPr7~8FvGo42*9Kvf0S z&!a6;AU}ApwzkvAhHUF?P1}h}Ndz?Y*C3>nF^d4sD~4$MnxVfr*xvd$7>e|~ z%e8tiy7sY7cXJi68E>^01yeg;lGS4PxIpG>4o-J)FG!6sPkEzjLeTkn&s+nFwh@pjf+4 zr=6^by@uPyt+aeh{C6-zFM!(>+iaZu}~C*pt*-9zI&jxa+{+$>z+zG-ya`MY>w?$OYFKvP0yW$B5b!C z^$lk$tA9YlT01TnM|5tEHj*eCC&sN8*#p(E&-ZIo*RpW67A3`=HIqF#QYL87*@FQAwRDl9dRhd673N1f!%T%BybJ? z|HY2@lF-SEbFqJjjCtP*aCYrd2k^c2jE8KH(>-KjzPrr+e|P-l^$U+A*8@`b{3dDl zRCOL%SGO0u?RPzdVBciu_J29|@WC!F+TC4e`(VlLo4@P-QM@_`Kmk>UspIXOuJXdE z7!7JcQrD|4Qq9{@ZFw?L=I#^q99-&(86xi>3ZTSmt0E|md~dj{LjlwvBvB1*QVth@ z{(towQOCkFyqiA7FE0EuCF@~rIR|+Ctr;EF^s8)gbN!h9-i`l8*rzhE5~BZmJG{U7W|+9c=ljs8+NE5m*u#NR@w3RxaH8Fe!7e?dji@X%)3YJ z*WO}dP4AKvY&`Q5aik64OR?d1!;l`9M-9{c^y5Vc$s_klXdQvdBLu=LtJB|>zuIek z9XL*X!#5wazB3!{tSVh40B*nA{?cXfyQLIvo;2^R-F|)|(|7|G;WF(>zIsgDc<`h9 z#m^0(9h;Tpb1Oe!i$eyJu3G2PVew1%3Ptk*$^XWBVMs#qpm1CrqJDX8?jP(QKiJ`M zrZ2!}Umlm1UR0dj{U#b{Jl0Nb7U)(X`OCah1%Kw>#e5-1U3l+`kx1kBUu>)=Q|Wj- zsGJR^MgRB0@^N2VT(Pkag(4KDw%`FaGbn$scXgt{X8NaBcW%6P=1~vQK^NVOF-|{w zQC5iePi^B?W5Rz^GX4htBSiBqs`L)@!aW)FmccPMXu@-N9#8*?`fvOW-*|78+Tn4k zV-z^;ltNP{sJ80vk^+iB4bD*wnpPsaN)tVPy3#s@MC` zW9ge8Gwh&SE*va^I0O;I?}BfvD&;eoypBznofB@j#YP<((q5#kmm)w_d18jKdRL5q%2x&&K#YlF6gAl^shAHt_U2{$kn?lrb9 zzB-e)cK9_uMsPgn>6d9_Bx)3SZ66eBA)U_Q8_Xu1S}x%7Zi9Jee?5QC?+#ICy!Xfl4#7X zU^G!03wYdP!;Ph3*ix+1sN^C}VGaiTdHJ^&opycW(dU;xJaO>t1DQX5a^(D9Gi|A< z|NWFq{~tevNW5<=KEHh%g*T35s1bA1Q9Hq=5`2=HtY)1`#^-QlI-A$;aaf8~a)rU+ zk0(m}Zl}pm>b!c*gW&lZOcfAH$M+C@9Jv zK=5(WiNz4fm0BG^TIg^(TP#>pq{-%vq?56r+pI%j(8&K*_$|hT;KuQ&Muq>sN3E~B z>vc;WXNE*iXX=q|pVit=*W2B)^Wt;@6X7N@%&HdTr1%eF^TZlkjG>qd{04BHex zTuWhdja|{SQNV8QN>H@ipwa4Z@Co7xIL|-GjSdkE!H_@Je}BP#wj;(-C*ge^sgvLY z6B%g*CU*#cOxfzO8-m@GW=zK5}Kt zoCkOuJ`_gXcuk@kX%S$}jhFhvprwTwCDcm_o^DE{=e@7cYWbSh|om|hs+-*E@E|K#L3Fp^(=C5e;f2eD`0>286kfNd;CbE_he z{e{;oP*=haVQ(nAw>FqYRP-0C*w}8CDQnyN5}>m{b+wUdn*x?(*FG5$CDN|8^kg%& zn=IxT?5NIa8p=#wQgZ{e0FP{aktiXZXEz@}UUm>F z=VFVaz!IAI!ghkD-01L}2C_R&*-SZq(m4=Ynjp*!5GN!hwFSO_By6hEAS%CLcMD ztx+Wm(PMAND13e+gm{x{+if)*2m3d55rp(ixLuM4>G7V>;YOLap^U^;k9r;ZM#+1! z21yZQoX8e7;xRcx{$kPBBwbu>JrooQ*U2VrXkrr{LK#W?ly^z+%VwHNdrKq1@b^0A0+$9@yjHrnS)@>z`yG*zTn3$NQEbf|KfCYfECm1@A48vW=%X&cq7A5c>7cUal*Y=X z?>ElmqO>Z?aSeV!idJ-s%Z_LzY?~?&$M|R#~=BZ~{k&>mbfq zmq-Zwxoy*`6%)vUO*2drn+6eSj#d~UDu}+zgLY`4X(Gjh@2Wh*if9pWT}=N%`bnn0 zn1l)|mPJoxT?5b%)3I0~B1E0!)g(YwfUF)xGdhl<+|eZnx0XJ0hU2xxm>fb&SJ;Gd z$1l(ZJK=NQr|3DG){HD%Va`^LjqLl~`~5KPU3?w@5rb9<2Aovf#C>Z8%ngW`Ow=%E{2#PhB&q9XMg1j|`4FWsR)mA-K_8tC z8u3Zo&(F2bd!3SwD3jOcg`fJIn{z-5{QFY7`AZ+UTa*5!yWq~Sonxg96z1qK8`u)m zGMQC>DXZ8TUqnN1Q3;x+S)Hc6K&0-K^-n5)%YfflH1aPG-TY>S3=-61_1~@6{-1!g zlAa-IV}H%@7OEFbUHA{H9{kpGN3#6sw`w&LyFx`*GC>HgE<5vB&|=_l;^0vp^8mpR z&0_jQ&uF85$#qs~iwVYrtPXoCah8I*s;g$HOGF zjAiU;rPT~eZAK2YxfCc_7(ucD z#AZyHa+GGQmP`rWxjJfDub7a5y|9LZKS#n|!<2E5*sg9h5kVuQ#}VQR(`!0vGCs0T z^G)KUCJ2B%<^GJ;1RJYUGuj4tmh`C@0uG^6Zo0Uf1kM->a@`*L;}G%0>Q6)*k<;h=X_g}*Hvs+CtMXl znqq|D-H0GUp|m?EU=>ZG$dR#OC8J$?a|Nt}xKkl>I}G(oam)NoJ;w#be0EsT0QO4U z_`FSnOkb^D2qTX7J9IuZ*ILHFwX1~#)g*FxqV0UM4F&Qcf6dMl#yN-=;O0P`D9I~b z%!U?HIYu7qAB1=vzrnj4od&@^nn#~VrnrAEN0B7SivF$leXajiDNmfi(?s9DYpMKE z0ACXIZ#`b_KYzK+|A_hyGS)>)v~x$|hm`4KAW6OPD~*Xq;=d*HTdMefYpDpFIHPJS z_#Y_)MPPiT*d;+RX&lFWxF#Kxir{kNUc$rB!$o*zc36#oOKSSYzQVeRkHy;f(hT#V zpYU%Hq_d&*$mB$781|^qefGRuV1&xIz8jVm*6lRJqMY}NneorvwynCNQPv{&Q3n40 zQMV@xcyJ-M!_7I^%%jTEU5LCWzA+SjBgi0Fhq3YJAKr{~0=8r^GpFQ-0 z;5HLWBM__tE6Kn#9O_1P|6-!V#2C{Q!>(^jt;#nnSo$$*)WhZDMBCk3Qn&$<8r2|F zaHl9HO-JQ^O+%vm7h#aXtoG7LrMU8&6lcrhRkN@il?Ep_* z-qVCJYre~V*zMYk0R%(9^Gi2a<5tV{t`{js+=ICQ#TT@t*>xr9%?X`D7>2V9iLV9= z>rBJx^wmu4j;sUSS2W#=;^>W&0JS8sVU;PIxFWY;pNR1us(Xq0fAKY-Iun_hnJ|Zy%e&u4AFaZR)ArlFop3{JgFRk)oc+Y+1Vbkx3Ogrb zu6o81k^XZsHok4j&~ju6BE=StK%XK32%)H*Ai|A*-;hgV)yb?#MT(#j132?>A(pSi zPV?_A_~O*3g3db7DGuB}^iz7Ac|e4zzv->?A2@M1CKpcJA^3VV50A{G_0zbIf?)G} zo4ZvGppBlg(P}@4JkQ5fZEa;ik!?C)J00h!B2q-Cb_pZRh7__c-HO>bYZz{{P5Uyj zPB+Qs%16Nt>6^`%BadE!kl@%H=!Vkjx~9tJ24k}cRNsz5Wr(6U$%1PDL|eI-&6WG% z$h1uPa(j=qqe+VqB1S{rcPrwdOWfX$wY9;P2t}98;8+tI)<{u1+AWSFS!m50N$+Qb7(=_ZHbu{8v<0{ZVu@+M=Gf_+Atj1d#&rn zp{7baVo{+Ho(jW-+0l;c#XF|lGzisd>X4_Zz46VNxsdc723t9zv^nFs#;cfF!!E5q z3B?xMr%R~=$P*Pgp;J1!5%}|Ytw|Hw#!CRLm+bGk1TBv#$ZT4$d z_n-jT+;9XUb2)6Ol_b9S%gZ(%(cB4b)X}tv=XL6uXXJ0dgB~_s-;Q@^wgi|MT1mRb zg&|bL2use#O{M+qMUE)(x#~H7iV3M(U(Z<>Q)!wAy3(0zd^FX5+SK$|Yp%0-R!qzA zAarXX1Z6Zdip??kyHsX|uG=DgM}Oy#$hRkcltJB)n@#iPt2^$JsT53_1!xsy*@Rb= z^*G+4rx#jZC;AsW6}YrrGr!9! zVw?N&$Te*7w_vinVA1$br41d*+C@YR%l92v?O)X!jYhM}M?qeGU*lRJSKp^3SkI=G z@;FKIB#fdYjpG+8QI&+6^-`S?q&-s+EGxziZI!MjEywm@tM`x-%+8Pi*fP>Vu;NbO z>#XEZ{t+Gl48geOxF9JUYLUcHq^fz!njm>(Fnm90U{e_tuR3o}a?{S~wKorM1u|EE zD;c_!4QEIxCszV3K-7=6XwSlM%buAak z{MXwtGTrXW=LjFVawP~U)(EH@k>=wc-}>30TXdv@H*{!RGh5lT#oC`_LGZ%5CkStx zY^ny&k-2^5^ER=>kt4^E*Y1!zfxKJ_?NFMXV!Yf+DTrmZwnw(aXd2$BdfZTZR!1>&xu zAQDd$5IXJg8%BgjWXoDnHdS+s9_zL}CtrJdv;CIool8N3^HZYtSgpHR^?Zc|=7eEfCgAIiTHly?^7GTW8)nKl>3q?&P zLPo3OHYpOk7_)fgsA6`ximQh150UB;pL(ITM`^?ihPFD>oZI;C9B()US%uhbtVo-`j4V zNZ7h2QKz$N7NoD|-BL*4vzc|Msa*R>*Ii@&@};+_@1t+>3_tfjv(IcZnr44HsFL*4 zq@gBhnGOH@;ycL&Gt>R*xRL+C^nL3sJO8Qv{70VNLHt*cqdhNaMd-LxT4EJpJycIiddKgL zPnu7LXpc%5KX}2q4BnEtCzUUv7O!Jfe_pSPMz0sIX{QItMeN-CR zpzG>|b?d8XEQGffN(S3g>X;I<6`-3#I1trBYixyZYVkr(FVc>P*vzTSH@{?yakBYiI5lz1wf$bo*wZ)v;!%NAY&RRdqL-`G`Fg12N+!PaP0 zP7+7@6OImE1^x(+m5lpsKUJrOtAodtA80If32oNh>Xd3ruMsKb@#j z3&H*z*_s^5>fWGqAf^0MH}+iWtM}&CL8NUC7v$aWuFWQnDr!PWx5`@4$l`T9ACXXG ze+uT-eaFqQ{)n}60CfMmir(9X9#F6a&)&YUVp`H7K1l?DLM^=3@A)wukpYnxoIx`K zViFAVrH#p8Xj+y>@w;HWln?M|YF966p)TCQ8y?=mevnYzKq_M>)3#@+6fq@>U6;2( zeM7zM77oTqQUVp)TmL-9qL3qo!={WP4dw{K$WCmYBlOkmPdW(_-6uq5ECqxGkRAkQ zt!?B1XbLTTjmLjw<`bJh{{GTjW=k}H&#)WPHszvv{`!KE0$>`$);`=`5S+3{J>NtR zM{bxlI`(m(G@y%BeRUMp=-|6wA2|F)`mwdccRmpnIbSKtm4Nspv((GRYz&maPVs!;oT_a-kT?3jb>#=`dfKlgHU^;Su0Z+iPPG1sBvKVO%2f{ zC_I2@*%qwgX#Bk43c_M;*MH(Vc9c20)gcEHWgx}?*EDzd+L`%@7F$=>2kE``g%J&U zAA5o{!8E(y0G&%jB7R72Nr2?R1JA*vP&%If_tK#IjFYin@IEUwS?hwc9I22T=ae@e4Fbs_V6jnB`+?_T|NSX?VO0)}t3-w99I6w7MLdG<;8ZTlqRbSVXcGw*#o z`|!YEc|V4X(vV95es6L2xFOx5P_`;vFi-0bWC9n}U;?@p_|kbhrs zaTpZ$Qx9WqPa&1{P1^fcU_0?QemPwf{3TB4`8}C#-|J|5G?-`_8<9qVQli%hwxcGo zxb-b*i^)=dL<5@`KW<4kDz5z{@!eCAEMrY#nWA>QbmT5mEj<$#Xhlok&y?_eox}1w zmbhY-^BxOUp9@#t>qy&Etpw6K?i;;+lvefd)}5G4-}PtY>QRNfC?coe3N$1Lj^2Hv z;lJ01puL(>ioQ5Qz({LaQ$z_lJKlAT+|)$dFSR=A6w%#FeQ(!%fau~yEdp-~%zbe} zcQ;-P|DlFjk5x^nY%;d=5ip{en2i6f>Dq=Re2+5o5oytW-fKCPHkA9qsr=0k`|s7h ze^}Y>oG3W>FRzBa-?<+5h12&d0{3|7`UzMp#?|B%$KW#7|K}>RfERvFH~)=O{r^8c z{E4K%_a&}>Q4-T8oyQ($^Lv}-$Lf<$opk8W_O&~HtiI7_WPkoh(}hYZH~wxr*$;Sh zZ(LMK8oYhYQhKy^aX!<*18h*9UaRVO3o9jwc?lm}4t;9BU+IEgO&pl~_S;nbK z?Q>*yVyWIJ!)s&Bv5Jv2WztBC?qpo9pmC~@D7E;=m7Q#pMHo5llTBw*B&E4a^2$l- zOoRFWxV#l5t+*bAvSys%zEvvFHEW5x$KO%TFwaaPD+ld@WK8n~Djm3Gt73&`QiJ50 zVri6_OT(x`i!z<*9F*gw|;0sN^o%;f;PSkyM52_86?Y3xUKSuIwDyYBe6B}{bY0#ibS z!9`4cN-_w2M&k#K&PSYc0bGluYdap&88-b8MW7m%?=?^0=8wNtudkY+st(IqjsF%_)M3A2jyb(x-NV-!!;)LlF#eI$bTClT0ro+C zN3TRJkVJP;&rkhGFy(bmkxa4%q?^UKbF@*gz5Ay(^?JK|u&E1UZ+B$VF%@qVD%qbM zJ(Q(i^lI~g6i1uK43L|{WS%~l0o7lzS0@XHB-t<3v3O|2<>+!V4dTevulw|JrdbIs zbPOxZn&(GhWNL&o_C(U8xh+@*TS;?|p8KLtn(qy456gkv1XFb#B?jU$4#Nk~%MNTd zh5z(%Jbs~_{pZ@C2UY%{68cB?zfuz3-}?rnzgY}FUSd|pwo+OC>-y&<%jPnPbkKb` zUgz19<1%f027YP3S3GXJBQYZ1&)g^V`!0pM?EN79kP@EU#%TCv$?9l#&%#NV-UnP} zM(A6J{W~$s+{q^X|2y1j@4fxprkVQSsa&^9Ki!4-GYRprY(jIAgp+!IVMzu>7d;G) zX4$vTmSx|K)&K^fw!zbE1ZpLTPy_%9qV`8WxrZky6O?XeJBcG#sWn_lvT|+&z>_75 z5q2r^(+thicGDIh+=|JP*)X5MLaJB-K~Gv>o(-rKNj*2z74suP>OPX8uE!6ule;u) zWU)HaNq)EAA9ARgID-l2q~L~eyh&FXOgMv=9L&U8o3)(GH#ZE2Vo-Jl66B>t+&o&!&D?us@`H^gW9V_-GX3fTF7(Cj&({7CfBTY!kEb#d_z;w znwtK?eW@vmMg}ydlTlfFm`+4DnK$fPo=&)eDjJKNwlKD}fRAB$bGB7PE}=-R+I%Xu z(>|%A8G3D)mQB*xEIPeeo9yyqOjQEbI+`IJ?YU{_nnoU1HUH6%e0E&H_VBGg*Wj2zK=WpTf=W<>4wX6o9$3arDrycB~#ZU@yOPKB5Rsp3-;1P2v z6>^LgGegx(K~TU9X{sEi_S;?b!@`Dz*FLi@myk-p3_;lQHV*O-PaWSA(Jdu!h8lNR zwiPFFyAz}TrnqO#lVv|a}8!&um>>rtTey-Aj zc5XFh6A2JLLo(GmiuCfB}5n%b6) zL|^dC+^kLyuBrhlU>C$ALO>@6Cju%q=voIbF<7=A*Awl#6038LJ}|!N1BtanOB-47 z>RXpJovUdrN>p=P!lJ>tqy4*Mp6UF9?6+SS)?Gyii~#;2!(gjc+d`F*yGZudA6{J6 zD!){l*9>R#QNd!P`gqaDc+3lqVxQMeHLwQ%Cg)BBl)W(OVdkw~ZaC1ff@K8{mhb*# zZ4e94pdKcEcoUoZ&iO@5RKnFu!J)v}mv-zbalL%`mwSImbMaGQcirN~hL>tI7+C8? zVGcL`=DNl{UierwwocdXhO?$x-acV&M+OoHMwByDh6Mc14%^e;%3NFP9y+u^L-_St z&ln$=&0F%G{q=elIEju@u~N77WW0w~s+KKRT}Nu?%z4Xtf^dNm4n^BzyZD6n){1Fw6sHuiE6VB?W zixS8vhUA2Y&ka+j*Ge+yfXU%!dF9F6y-~#3WAtfFrXRP1@p`-}5H|)$id{(9Q8t7E zXch^fkYMAO2`ja(laS4$s5F+4W-b&cK!Hjc)!JWQ-_#{N8;J*vxCjE5BB~n_zh0oS zC#s+?&d-8bQRd5qZlDhiUSqDU|3 z>Xl3hAR&cDSWz%WKlVJsTfFl!-AHAmg)pTJ<2t{%bbrBqFjHu)aDRMLs`t~ixFV0U z+wg@a#m@y%mKRCHixPKs3bnAfb^jAM{6lwDd}$m#<28hOHYSYJU~6;}5}7B!V9?XE zeM#hb^r0*YO7X);^VRiVU31O4$CQ6_yqa!$gs3Z8(+fKKdi`BZqv+$p9|uwF6VCu| z@ot?mQK$zn=riI;90kFJyNCvHd;sD$GZvr+T(u@!;mj5iF<)3EU=f&RZP#FO^%wu- z#YK)1T0`JeYKbXa>Z7wqs}I|lFiLO{LFOxnlmXxHo{jsVe@)C4$=Ib}lU!R^8(nJ;O?krUKnGK!3z&dqx`%Kje7uWdd9MoI)&=;;}LEYWC z+@Ac|rJa~r(;&;dOMeXqI^6bdv<{tyA2b?;S6Z(Z2N`G5cG|$?ZKXAxh~|~6HaRt% zht4RS&Dlr3W#36mG(cA_Di?EVm;LJ>zB-%w4dq@Rg%<}l1UGyiy~mFh=7$4c$go|? zNV%9@yVBKfUwYO#_e|xb>BC4k`|(ZJ9Xh!GneIsaTeH(<+HF=tj%Avcl|}_fli7po zYr{!hF9;)E2!ke)97b9L;plA`jdV`il|CUy9GqG#I$c0BLZIYDmnmpOBJ;V}M@=xj zPep-|T`d0nlDrl{D{a}&4F`%M61WiPL1P@+2%VdJcZeinr6n|jN>tn@O8KoPry{H* zQlDlnsde6k!Lx;mn4XsS$xgTKqHX-{RloPu?dyqDiJIVDgkN_C?L>WPlpRDTp}YfS zt_Q06W8WV}ylLWS<)V!%I=CN$huQS@`S&c}KV>`iD-WG!Lujuesnm{q?m!HTW2~oS zxd^RRx}sa9-MqYLM3Fs6-!t%Z=7Rb*KW$WrU)cErgz z>$?XJU3b&keF8%1(a;@Ef90%8FMfF1^Ip9`t>Ug#VF2su>fd_~B`{4d*efJ}8%fnk zQo=^tbR&CaCjHWM`_V@wyHbVCSBC|cDf23L-;a9~(owU}g(4*+gxRdyDT>v3zxpAJ z!u7}>3WAv8ouSnh9Z4TW(la^MJIp@qbWoR)*biU9kk*S&{Nr+=cySQkE ztEzsK7k-lw+-aknE`ytm2aT&rpR19#X~Xig!+bmu5eS)e^213)x!aX{a>X$5_mY>d z*K!@6lBzMr!dgue&6dkq zCgDZsFL2uLzb!6ZMW(gcd2A{l1Ft6y`Y_gh?5w(8&yCy&$+ zoX^Z8@|bxx1uYUA)|6`@{sHl}v>kiCdjrJ>^pS~se?h4D&|>Cxs+Ul+_|t2k+P7ZM zphODsPQVgE5B1G>ntR&@+q?nEw-T%_vsOnvoBVor z>I;scB(b+rMOeu@+uxXwQ^Lu_sC{%+FI)>*e{h#X4@ z6=E{@BD}0&u6LKWq&7OCITmm?;-7Cg!&=YPz5DH_*4NchjbjeUPx%Ul6|(Za|Aa-@ zBSWfRd47q;GUMjZNhc;T)FjK4Rz zxb}G-Ca#Y#R!!iQD-$A(jHoRP)l%V^CE`HU;5V^f0T~9M;ij}rbRB}g2i4t)<78-= zU6P2+W{$jyNoM_6CqZd^H;N)mM4Jr8q*5{{z-Xj+8bg2FAR)w8TUc^qV4#WYy!(fk zP9A@3Dk3sztl&oUk4nzcwR0T*?-k$HIdiM|2h%7AD(U{q&0#r#n{U>xag?cB&Qbrl z{ShY4lF`#y_^BCdMIjK?`D|OA&4ftZbU)yuK&Y?l4}}91!q40}@AE(WAot4J)qUUcM7VYhBHI2WzKHU<2L;Qt5{yxV|HtNd0MxVR~&iwEcwK@21 z6;qU*U*8D2{e80@4CgYq{a&?RyqPk*DbbkOsh76zsF&WQ5GocN>3S-PovU|9*QyLd zYHBdvPD&K&WwlvY3ql5lOMGy|DqA)>g<$1;HiJ zeMca-yca?$7dI6IryB%9?4I?5CNfGSBhc>y3b(=s;{qZVO(8pe73iidYyBONrN-UB zRgE(>TuyF87qjZmNfmc)`e{ezU&g-DvNBE5q3c>}f>lE@QQi-8A zis4L?TG<$LWkPYPE<0WbblVMY>lNgZW3A_!_~AOw%TC3|F=hhL_4+h^yiInHNrt*n z+bo9&avTDeMmjI6T9n^RVg9w?U;3b0^H#EsLLYl!eC{P>zcIM+MzEj>T>J)4t_A3= zri9TAElNDFO0a&`=n(Ge27xgLK#`=s+AVG zjF2fdT?}v++ndO2Uy?&Ql!*l9!*pILR$Pi6@F)_xSuFtqFx~``O45vFWg>3UP9Ow4 zVN?M$3et?mz5a3cA=Y3-;6GZvcW-&^I1Qg`!-hXPZ~y-{?zwLF?w*Ixx=uXLdICY04SrA@ z237k`5?NJ>F`^iVK2wY#njiJcrcP2Rm0^1&yRF)20> zPcMXh4>YTu>krb9neaTvQSBCcZ*%5CMPE*$(22}tosBRdoUK7NNx3~Y`f%^EKc8)L ziswadeYp1J#`vYUr_BWr7has|`PvX9hIVm4I~JEyDZ63-;^~8#y$XHAD|9(_>#)8b z-HX$k+IP5(NU_$qtu%DULEzi^vd7s^?e=~gSR^sk#zBQ06UT|MgInyHE#fPvUEkcO zCc%!W))9IkLhKX%P|(>#+sC=@PZsiMw2P@Tf`fP z=(I78$?_PLcU}{S;L0xn)J6v?n26~>9Gq=S6heP+HLww-Y3O!YK#a;nvEF_)bm2q*)2fZ5(fJ5O5(WzA#S}#|e z7X7uSqEAv&nikHOeali{X(>Ge&Xi!!aU8#A(2ak7dybgbB<|j84DvdXD4{H!m&3AI zXC!f4?J9sS_G12XBR7Q(YQ082!@%p z>$*hAwqGUJ9$o9nX59G*&Mxvtf(LNk8=G>aUwSIx_}1vzl4li~*oYBGw4SO05lII7 z5WDEj@{?OVJ+F2iEt&iyV#$a0c5H!-g@0aFdgWChE=b!Yp{lxQU|OBKg}1{}0wMm> ztQGs=h`+0sN+Uu&-pxm>$m5jOxavbnKdb9NV+1v#bfOYS=k;|xV2X`>bL2mzn`Cta zni3u-eIC$B5D`PvzFY6b6+jQT51nbMh&DnQ4_YL(v4nt+K+8-b?8y^g^MBR95sZ;Zph@xo<`SDMO1Qy8k-Wg34B*(E>Q@wLH9Af6XQ>x2Agbk z6!%y;-z?)AE0FJi%5V&{cbcQRiY2F)PR;Rj#9JQeg9hc%&|0a8aAc>Zp=v1iq>p5X zZ8`j5W-D^wMjS2GHir+z`KD_*ZHwPn*`;bk(`ZSYtF^8hgXK2Pd!gR-NhY+Io?!3J z@6jRzq#~7F;W5El)+CR5#O*EOwUM05Ualy9fv8uSn_)*lC{5hZf602DFC}mbRNm(;U*u>d>2p1E46u9dCP*hFV0lWm{a16}+oq~II zR)QB>bQdD5ONg~Q-gSQk1=E$HexQW|up43KDfmpX{6a`wK5=_iUzG!9>^z@Xn;aWO)(uQ-dS;wD|Q|Ym5;DOIA4Ln@R^{6 zb{f@2^B48goh+EQvXHEWK*L2?3>X)wdGT)na4<2CuyCKQWR(H{_>vFf*FVO6lW^#_ zZCqqSlrGQi-K(@~8m;HwCwv+{SI&Zw3?i2yDqmK>K6uI^^*3;yY44jK?v=RXFQja7V87*FAC_*=C`6~jtI z{-Q9=AHi+N@^32JvMwBX_l$lJ$LG;L3b^9ZEhZM8<<2>x(wk$5_goZSc+2PCUoFbu6c`Yd$0k3ogv9s zxihV+hhE2{q`vwQQkr%%RJi>Z&Z~rbJSa2M(YGBrKiAgNL!NJ%|G%4yeW%(QZUW1> zwhsBWeo-mv^P{}DJW=kQmc+ic{UAKv&AYRimT>FQGIElnJ1zX-_!*D9)6VPtQ_4@e zV4GXt(31wgx4?)y>PjSN+0bpjD*!w|63}T-F~D@h>?z*BK;}R-R71U%jW}sE_{%IC z%@~Jis=+DuCabpoLDBBBjcnA`Vwl^y$XZ4z?JJDZGX3w@kAKK*W z3t}U%-ckXW1mxTdiwP3x-h%c*PQGzB;#~R4~8LVB^J|X8>#DjZ3%h~aFj`p zMRbTX(|!Xgs(7f!ntZgx`h}|FDSy6L)?^ zTMh4gF(=pe;WrKc2$6(RA-s0f1 z%TF@tCg+e9OxgniV7}V|KOjwKZkt7v?I3Snfdj1B3I)b_A0E)=e*(aMC;u!cm8RgjFeQBp~EkaVQom@?}) zxMb_oQRHd_@)hna3UT%qiqWpXt^}vCyMn8>C&mrh8+s~}QhB$Qa+s+WDrHV}4^`^a z7_|s@U32=sdg!U;h^V{;p>gBFl`jP<3QEPz5(7C|aA6*@Kx!0i-`tZsMpg&EYOZ6Y zp=TE`aF}5ja!g+PDr#gg?Ub>hv?a%rQF%q+8l3HtsTc4Ft@WaJu*6RCnjNM z%iqI{?(Z}sTi-#2eECj7xmPN$xiYR}q0>$gYEDB{5a`D=e&}m>CFD+8R1#7$uOJPJ z?(h8axRx?`b7m-791ap;Zj(b_uSVUCp`!B?5Kh=4VqSSsR#ZndaUT`9%TCp^cq8W; zz~LdM6qKTo)99a(hdk0%II8JRiS@Wsb&T+i>sj9ilSyM%by8wWZMK+Gg?NJ^s0@EZ zf;YxD6#~dPnLBTJq=U06M4z~DzRl!tt>*m&mxMKqnym-zsd|=|k%If)SRN!(HA@Wq zL_nCwou{8G*4=_!%x@AT^?h_dqtc~QAT%YJ?}pQuy_*Zf({NCdT9AYS^I@feii=)S z-!fbTR;iQw5{fAvd?*ib(gZ~ICIs}7? z4<_FoHMbJ5nexj_C?-(Am%?69uuL;x(RhEsYF)yJ%k2VqO-J+@T=Egs;am z-N+W+oE!DE3(|T^>>C#~q_qldm5vB{F*8cK#aB?;gul^;U$S-!>X)jHT+&J86^#W1 zy%KL+S(e(#hw#oTdCf2#G=u%k4>tx18BR6*%H+k!?zTC7O_HCkOmQn~Wm*@}-|XUy zJl&%8zDQ1t6)! z`zRPfAPj_s_#l308#v!~2nV4M9ufeJWrFb*ydGd2_jY2mS{oL`ay)ZBJmMvG2XWJ^Ps>6=h3V_FLSJTmUg21JCM2RAB#KLDMN-kx^(Wl<%voF4OW54?Dho9Xfyg&V}g3%v;{j+JSmpW7R zUk4Ob(+$(IlWVmv$Ms^`^lv90O$bjQ#`YcU=V>=_GDM-$=nN){&Ebv$?%F7*%2ZWH zRTn|^AgCIv;#qUF1&i)ka^EsmK*1P;P&Z7=#u7^`|E3XyQJmn}e6d`uH{0F*K+=q| zUoIdo%Bq%4+x3Gwp3ax+?f!Va-i)Z|nAo`Z1ZHAVa!P7idPZi}DD1Az3q-uF6cv}0 zmX%jjR#n&3*3~yOHZ`}f*sYwl_Kwc3?w;Phe(u2FSniHH>hgb1+i14h9j4o3`y4Nb zlB}qjZkU!09fV!t`2h{17-2FJx9fE9OF3ZzjMTvhV@xo`409~7#0qO{u*D7sIFv0% zt~~h)5Rs4-Dnda;L&w0x!p3Rcy?FQpgha$7q-5k2lvLC-v~=_gipwppe7E~}n`C5S zW?^Mx=imf^xwv_F`S=9{g@i>!m57N;NGesPT!l(i9rx{jQ`2ww|DkUD={GfM8h!um zTeWG|q5j{TyL9W(t53fHgN6(nG0u1sOf+heF_T01E2f%;Axg9uvEsx_z?3LSvJ|P( zq|1;gOST-j^5iQ}=%ymYN|Y*7u0o|M)oRqLQ?EgzCe2!~u(jf7)2>6OF5PeG*F zz@VY8pMLY~`HPopuU@ZjY;J86b`_!9T_fkZMi_roX_rq`xFw!|4|4c?M8qwoZWD3` zN8A4^)f$Trp`O7v@-cf>Pndn`wo&ambm~&C!GJ;7prxywDDEb`{vaKW#t@947*3EB z&9EFV{DN1i)QCo_(;JK?Gjj_|RDmf~YK>Nh6M6$_G?^_{o8950T(q0apejEmnkK0Cj-yt=-* zy}N%%reZs$ncU7fK|3Eolfnn2QG8%Q{(~zyvSq1N#i1^lH!>CV*(p?@T7J51_QtBm zk>Kt6`esDEsWGu}@d?btq~w&;wDgS3tTEzUl_zHu1WHQBziyOQM7y&KiA7XQ`RNv-fP*P zxK@TKDqqfU2_yCnrG&+d%FyCUrL!@d0CI&=r6x66o!&q>Iyt+zy19FJdU<1r5-moo zIPnrNB}$SkMXI!ak?Kymu!9j**ZQi2U2X>&jGDEh;h3^!0TCQ{2%zm4=TYVG_r+jC zPnL3rwc^O1dE|M1-qos*gZl>N(eycd4<2IA?^=#v5Mn7t=l4mq>NN34Z4mGP` zYB&Z4#@?`Qs46XQ9$N_r(#jzf6;WeP#lGtX$?6`_O|R-08Yx|#Pf^?rxg%g&*fdl3 zo7;W_Y{fg9J9TDU`^ZptIg@%I?57NPw`$&EJDiq^SGHaS@AV%J9XIUdH+sJm{T6u98&+5(X!qMr67#^diwy6k;N_l@{J)wWLit0ccq zjn>Loi~jpu>ut3o9ugn;Tz|K?Yy)+ zzcoIw+ePv6wSp;dfe-5d;ekHH_~4H4JZhN#D9mZi+{HG&xyKiJG%U5=CF@wmnl^_m zdB>`%331iG-z7gk|J^iv5TT@o2Wg31{!dr+$n>eg0>Qa<1tFkEb(m2THf%Ws{8EUJ ziSJJ~+?`(yJM)*Tn1+Nm-_YogEb;94TDrFdu8*82sBIVNq6(d!!V#LD{$T z;Dc-8&dn@em%(5-M=VS*cjIQ1E(;M){2|V@O?elS7@jXrKzQ3f1E3De0P-e`*w4An zX3m%VQ8=2A{uymp{*TK`Rb#oyXGQM$#8NT<(>U-p`IS;U6{R-?2B>)%*esw5Xl&G)*BBw&qIb@=^Y##S*CU)fM}GQ zWqL_#geIBcVw5m)89Id#Gh7;h$+*x%s=c#2iY{!gYEC6BO(>&QD?nu1o-4VXLn);< z`wWB$Wz?DjOktaV2opx9&2VKKIr5**>jYm#HCrgEyR?|+HE7IChGG9=^ZdmfsQ5D0qLag=`=Z~ zoKdsZ-8jINTF9Zhg^Ac3p(zDvlWC&Zq3T{a1+D^~X;}dAz1-<`4Ilt65+jPC>?xO! zo#1K$Tp+Sl6T64$1fkTiRC(KVXX{tSRo)q=Iy{IV6GACc)skX$ijJ7|tSmugllvSy zlY}22Qd2JdtB>Vb+UOe3kyk)@!hY1QRaPHrP%mnww$VR&fLehw5NTGA>zD|)2A%rG zR|lwSQ_U*P07-M_1hA|OT8~{*vQ9T=f^$+h_TbynqK~%DSveE z)E)Be-IH$~5oAUnC@5iQNFWe6R8XQIFeGG<9Z)=c%Fl8w^kV3mwfAJsd2GiN_| z+$bp-@XI@;c-r~4$l01q|MtWG0lMtpLv9Brl!_10rC`sMDh~f~HVbrhLHI0{ch*sQ zdX|!$Wt5(rbRI2A&!L6-!@nWp($u_sH>-~9ro0XJm2HENk9lbBZ&~%b-@p0eFbR-Z zf#i|brHB1lzg|jZo~nb4@(qr4Kt+S>EuqJla^${DArbpysCr2}3>)9+VSD7tepHQd zxu}WkIQA4a!M_O;S}_}1<6+3^LQWXFEe}&9O_cp26Np1tSCMR=krNzst7Z1%%6Ut) z6Y~ySZ{kvE(fYLjC-G{Xg9>73J!Oycs#n(;Tqlz2wun>I6*-iLE4qo8AXe)+?IzTA z+Lr4)P3le}d&HG@9jvbUDrR%FwMtCrjQM^N4z4I>)6;360`Xh5F66TWa zD=0uGkT*aLmSbA^F6?&WZDjQ1rdOQ#rgGja&gPxe!8ifd+4qHTb$Rc?73R)gcfmKV zGaNQ{89sS{k&hZAb-3hr5mkT5`Q*v;CVJ%WAHMnX`@@{CDDQ>;UaQbSSymvQ0(}U* zUfKD^Z`$brfkE7yQc7vHp48=kFxqXTmfo3Dr(og%A=z0 zSWva@OjI*87~j@wQa*7G!3Vfx`D4{8z2p71Padk(AO7(qg|vY6Vyl?+)o;m%GEcuT zE{naebO|!K?D2RrHL*Bd?P; z+hvoLhMW|*pp4AnWE^}Jd1DOAp{&}vaEzi1GB{Q1ipXtUKjj$r1wd#){gm!4#Qh8N zawrF@F+t1g6Kp9ay@#9xz3^foRw#A4Z6_Rh+myTCmIZTdQ`XwnMZ;}Sv`x}q-u>>E z4`+SOvvtziwQ-HQp|#l~Q&sX(#d%8A=WMF27COnWm_*@|K`{*2i^$S};lMfksB%h} zj{LcQkg&kMB39r(mzige}x_mXHqg zehMZJkg~TG$sr-DK1*vsCJhLg=u+?aKBI|`jF+yfDp9_5aCle>vd!od!x+52Iy)$H zj`&&9E#v1t@eeWm#*cP7y%<;WS22BZN%yA;XXFTD-D8Bxl1m={Ds@)X8X(%{dkw30 zLm09wj#kRU_uo&swBSh3A#~fK?~l<7DRvh9W1h=jMOyul z=Wb9DWsD1{v|(C*+2?XtE1EO(;|-w&&I?|TjfYISbe86G0)q%MP7Kqk9ouG8&p-l2 z(o`@5cu>kZ!3)wtK4FP!PeF8k2P+%QPNw)S2@TOqR(pDzf;$@Q!sd}hrB0D3;-W5t zFHm;aGHfo6P;@~eS~JY=Fsix`HoC&f#IQX8j7D2#Ad8ky8m5B`3{_-^DjF0cEXsyW zB@+WfcGz0uf@FrNF;N!j{0_s)3t=UTMbj}zLAWTSa$->{hJ-9vNghRa$#q2xF?yk= z1{$Ue(`-7rJVhZs!*%-TX)9dnhn3v4r(YB9eq{Kubm%-DJ|#SG_e%G)%?w{+95cR3oHFOE Q>#q-E`1~5?PXGV_0LqTGfdBvi literal 0 HcmV?d00001 diff --git a/website_bkp/assets/fonts/Lilex[wght]-v2_620.woff2 b/website_bkp/assets/fonts/Lilex[wght]-v2_620.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b74e3e197600b47d0726715649eb02462b26a815 GIT binary patch literal 93604 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

ff{(WaF|E@(ej4Z>LpdMGRtbbVjiTj48Rdf5~ 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 literal 0 HcmV?d00001 diff --git a/website_bkp/assets/logo/.gitignore b/website_bkp/assets/logo/.gitignore new file mode 100644 index 000000000..23376a961 --- /dev/null +++ b/website_bkp/assets/logo/.gitignore @@ -0,0 +1 @@ +3d.html diff --git a/website_bkp/assets/logo/demo-svg.html b/website_bkp/assets/logo/demo-svg.html new file mode 100644 index 000000000..bc9f7fcb0 --- /dev/null +++ b/website_bkp/assets/logo/demo-svg.html @@ -0,0 +1,379 @@ + + + + + bitview logo (svg) + + + + + +

+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + diff --git a/website_bkp/assets/logo/demo.html b/website_bkp/assets/logo/demo.html new file mode 100644 index 000000000..dc87c5f20 --- /dev/null +++ b/website_bkp/assets/logo/demo.html @@ -0,0 +1,650 @@ + + + + + bitview logo + + + +
+ + +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+ + + + diff --git a/website_bkp/assets/logo/logo-dark.svg b/website_bkp/assets/logo/logo-dark.svg new file mode 100644 index 000000000..e589cdb4b --- /dev/null +++ b/website_bkp/assets/logo/logo-dark.svg @@ -0,0 +1,37 @@ + + bitview + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website_bkp/assets/logo/logo-light.svg b/website_bkp/assets/logo/logo-light.svg new file mode 100644 index 000000000..0d8a3217b --- /dev/null +++ b/website_bkp/assets/logo/logo-light.svg @@ -0,0 +1,37 @@ + + bitview + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website_bkp/assets/logo/logo-orange.svg b/website_bkp/assets/logo/logo-orange.svg new file mode 100644 index 000000000..6414607d7 --- /dev/null +++ b/website_bkp/assets/logo/logo-orange.svg @@ -0,0 +1,37 @@ + + bitview + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website_bkp/assets/logo/logo.svg b/website_bkp/assets/logo/logo.svg new file mode 100644 index 000000000..b43af3f90 --- /dev/null +++ b/website_bkp/assets/logo/logo.svg @@ -0,0 +1,57 @@ + + bitview + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website_bkp/assets/pools.sh b/website_bkp/assets/pools.sh new file mode 100755 index 000000000..ff1f73ce2 --- /dev/null +++ b/website_bkp/assets/pools.sh @@ -0,0 +1,10 @@ +#!/bin/bash +set -e + +rm -rf pools +curl -sLO https://github.com/mempool/mining-pool-logos/archive/refs/heads/master.zip +unzip -qo master.zip +rm master.zip +mv mining-pool-logos-master pools +rm -r ./pools/.github +find pools -type f ! -name '*.svg' -delete diff --git a/website_bkp/assets/pools/1thash.svg b/website_bkp/assets/pools/1thash.svg new file mode 100644 index 000000000..88739a37a --- /dev/null +++ b/website_bkp/assets/pools/1thash.svg @@ -0,0 +1,11 @@ + + + 1Thash + + + + + + + + \ No newline at end of file diff --git a/website_bkp/assets/pools/antpool.svg b/website_bkp/assets/pools/antpool.svg new file mode 100644 index 000000000..df632b3ba --- /dev/null +++ b/website_bkp/assets/pools/antpool.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website_bkp/assets/pools/arkpool.svg b/website_bkp/assets/pools/arkpool.svg new file mode 100644 index 000000000..7f12f6570 --- /dev/null +++ b/website_bkp/assets/pools/arkpool.svg @@ -0,0 +1,14 @@ + + + ArkPool + + + + + + + + + + + \ No newline at end of file diff --git a/website_bkp/assets/pools/binancepool.svg b/website_bkp/assets/pools/binancepool.svg new file mode 100644 index 000000000..3471b50d2 --- /dev/null +++ b/website_bkp/assets/pools/binancepool.svg @@ -0,0 +1,11 @@ + + + Binance Pool + + + + + + + + \ No newline at end of file diff --git a/website_bkp/assets/pools/bitcoincom.svg b/website_bkp/assets/pools/bitcoincom.svg new file mode 100644 index 000000000..7d86efeac --- /dev/null +++ b/website_bkp/assets/pools/bitcoincom.svg @@ -0,0 +1,22 @@ + + + Bitcoin.com + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website_bkp/assets/pools/bitfufupool.svg b/website_bkp/assets/pools/bitfufupool.svg new file mode 100644 index 000000000..240a9b32a --- /dev/null +++ b/website_bkp/assets/pools/bitfufupool.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website_bkp/assets/pools/bitfury.svg b/website_bkp/assets/pools/bitfury.svg new file mode 100644 index 000000000..0923e2695 --- /dev/null +++ b/website_bkp/assets/pools/bitfury.svg @@ -0,0 +1,12 @@ + + + + Artboard + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/website_bkp/assets/pools/braiinspool.svg b/website_bkp/assets/pools/braiinspool.svg new file mode 100644 index 000000000..84ebdac28 --- /dev/null +++ b/website_bkp/assets/pools/braiinspool.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/website_bkp/assets/pools/braiinssolo.svg b/website_bkp/assets/pools/braiinssolo.svg new file mode 100644 index 000000000..70c4be9ec --- /dev/null +++ b/website_bkp/assets/pools/braiinssolo.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/website_bkp/assets/pools/btccom.svg b/website_bkp/assets/pools/btccom.svg new file mode 100644 index 000000000..cdbb5425e --- /dev/null +++ b/website_bkp/assets/pools/btccom.svg @@ -0,0 +1,22 @@ + + + BTC.com + + + + \ No newline at end of file diff --git a/website_bkp/assets/pools/btclab.svg b/website_bkp/assets/pools/btclab.svg new file mode 100644 index 000000000..1f141a0bd --- /dev/null +++ b/website_bkp/assets/pools/btclab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website_bkp/assets/pools/btctop.svg b/website_bkp/assets/pools/btctop.svg new file mode 100644 index 000000000..c14b931cf --- /dev/null +++ b/website_bkp/assets/pools/btctop.svg @@ -0,0 +1,14 @@ + + + BTC.top + + + + + + + + + + + \ No newline at end of file diff --git a/website_bkp/assets/pools/default.light.svg b/website_bkp/assets/pools/default.light.svg new file mode 100644 index 000000000..fed7c7412 --- /dev/null +++ b/website_bkp/assets/pools/default.light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website_bkp/assets/pools/default.svg b/website_bkp/assets/pools/default.svg new file mode 100644 index 000000000..d3d9904c7 --- /dev/null +++ b/website_bkp/assets/pools/default.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website_bkp/assets/pools/emcdpool.svg b/website_bkp/assets/pools/emcdpool.svg new file mode 100644 index 000000000..ebbd0ef6a --- /dev/null +++ b/website_bkp/assets/pools/emcdpool.svg @@ -0,0 +1,17 @@ + + + EMCDPool + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website_bkp/assets/pools/est3lar.svg b/website_bkp/assets/pools/est3lar.svg new file mode 100644 index 000000000..c3d8670a3 --- /dev/null +++ b/website_bkp/assets/pools/est3lar.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/website_bkp/assets/pools/f2pool.svg b/website_bkp/assets/pools/f2pool.svg new file mode 100644 index 000000000..9632ab223 --- /dev/null +++ b/website_bkp/assets/pools/f2pool.svg @@ -0,0 +1,23 @@ + + + F2Pool + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website_bkp/assets/pools/foundryusa.light.svg b/website_bkp/assets/pools/foundryusa.light.svg new file mode 100644 index 000000000..82b2ad5c4 --- /dev/null +++ b/website_bkp/assets/pools/foundryusa.light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website_bkp/assets/pools/foundryusa.svg b/website_bkp/assets/pools/foundryusa.svg new file mode 100644 index 000000000..9fe156123 --- /dev/null +++ b/website_bkp/assets/pools/foundryusa.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website_bkp/assets/pools/gdpool.svg b/website_bkp/assets/pools/gdpool.svg new file mode 100644 index 000000000..000369bd7 --- /dev/null +++ b/website_bkp/assets/pools/gdpool.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/website_bkp/assets/pools/huobipool.svg b/website_bkp/assets/pools/huobipool.svg new file mode 100644 index 000000000..b2cd9717d --- /dev/null +++ b/website_bkp/assets/pools/huobipool.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website_bkp/assets/pools/innopolistech.svg b/website_bkp/assets/pools/innopolistech.svg new file mode 100644 index 000000000..c96ee8c04 --- /dev/null +++ b/website_bkp/assets/pools/innopolistech.svg @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website_bkp/assets/pools/kucoinpool.svg b/website_bkp/assets/pools/kucoinpool.svg new file mode 100644 index 000000000..484399826 --- /dev/null +++ b/website_bkp/assets/pools/kucoinpool.svg @@ -0,0 +1,11 @@ + + + kucoinpool + + + + \ No newline at end of file diff --git a/website_bkp/assets/pools/luxor.svg b/website_bkp/assets/pools/luxor.svg new file mode 100644 index 000000000..233ca5f67 --- /dev/null +++ b/website_bkp/assets/pools/luxor.svg @@ -0,0 +1,24 @@ + + + Luxor + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website_bkp/assets/pools/marapool.svg b/website_bkp/assets/pools/marapool.svg new file mode 100644 index 000000000..2361ccc56 --- /dev/null +++ b/website_bkp/assets/pools/marapool.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/website_bkp/assets/pools/maxipool.svg b/website_bkp/assets/pools/maxipool.svg new file mode 100644 index 000000000..0ba549d47 --- /dev/null +++ b/website_bkp/assets/pools/maxipool.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/website_bkp/assets/pools/minerium.svg b/website_bkp/assets/pools/minerium.svg new file mode 100644 index 000000000..761d13b95 --- /dev/null +++ b/website_bkp/assets/pools/minerium.svg @@ -0,0 +1,3 @@ + + + diff --git a/website_bkp/assets/pools/miningsquared.svg b/website_bkp/assets/pools/miningsquared.svg new file mode 100644 index 000000000..76b24a47d --- /dev/null +++ b/website_bkp/assets/pools/miningsquared.svg @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website_bkp/assets/pools/mononaut.svg b/website_bkp/assets/pools/mononaut.svg new file mode 100644 index 000000000..bfba0ba70 --- /dev/null +++ b/website_bkp/assets/pools/mononaut.svg @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website_bkp/assets/pools/neopool.svg b/website_bkp/assets/pools/neopool.svg new file mode 100644 index 000000000..ce39f9605 --- /dev/null +++ b/website_bkp/assets/pools/neopool.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/website_bkp/assets/pools/nicehash.svg b/website_bkp/assets/pools/nicehash.svg new file mode 100644 index 000000000..be4396081 --- /dev/null +++ b/website_bkp/assets/pools/nicehash.svg @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/website_bkp/assets/pools/ocean.svg b/website_bkp/assets/pools/ocean.svg new file mode 100644 index 000000000..53eea5302 --- /dev/null +++ b/website_bkp/assets/pools/ocean.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/website_bkp/assets/pools/okexpool.svg b/website_bkp/assets/pools/okexpool.svg new file mode 100644 index 000000000..e0911d5a1 --- /dev/null +++ b/website_bkp/assets/pools/okexpool.svg @@ -0,0 +1,24 @@ + + + Okex + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website_bkp/assets/pools/okkong.svg b/website_bkp/assets/pools/okkong.svg new file mode 100644 index 000000000..aeef1568e --- /dev/null +++ b/website_bkp/assets/pools/okkong.svg @@ -0,0 +1,57 @@ + + + okkong icon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website_bkp/assets/pools/parasite.svg b/website_bkp/assets/pools/parasite.svg new file mode 100644 index 000000000..e85d06af5 --- /dev/null +++ b/website_bkp/assets/pools/parasite.svg @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website_bkp/assets/pools/pegapool.svg b/website_bkp/assets/pools/pegapool.svg new file mode 100644 index 000000000..9a1eb76c6 --- /dev/null +++ b/website_bkp/assets/pools/pegapool.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/website_bkp/assets/pools/phoenix.svg b/website_bkp/assets/pools/phoenix.svg new file mode 100644 index 000000000..3201299dd --- /dev/null +++ b/website_bkp/assets/pools/phoenix.svg @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website_bkp/assets/pools/poolin.svg b/website_bkp/assets/pools/poolin.svg new file mode 100644 index 000000000..17cff3f15 --- /dev/null +++ b/website_bkp/assets/pools/poolin.svg @@ -0,0 +1,13 @@ + + + Poolin + + + + + + + + + + \ No newline at end of file diff --git a/website_bkp/assets/pools/publicpool.svg b/website_bkp/assets/pools/publicpool.svg new file mode 100644 index 000000000..6c00e11cb --- /dev/null +++ b/website_bkp/assets/pools/publicpool.svg @@ -0,0 +1,301 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website_bkp/assets/pools/rawpool.svg b/website_bkp/assets/pools/rawpool.svg new file mode 100644 index 000000000..bfbf1f019 --- /dev/null +++ b/website_bkp/assets/pools/rawpool.svg @@ -0,0 +1,27 @@ + + + rawpool + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website_bkp/assets/pools/sbicrypto.svg b/website_bkp/assets/pools/sbicrypto.svg new file mode 100644 index 000000000..1e7aa58e3 --- /dev/null +++ b/website_bkp/assets/pools/sbicrypto.svg @@ -0,0 +1,14 @@ + + + SBI Crypto + + + + + + + + + + + \ No newline at end of file diff --git a/website_bkp/assets/pools/secpool.svg b/website_bkp/assets/pools/secpool.svg new file mode 100644 index 000000000..31b11811f --- /dev/null +++ b/website_bkp/assets/pools/secpool.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/website_bkp/assets/pools/sigmapoolcom.svg b/website_bkp/assets/pools/sigmapoolcom.svg new file mode 100644 index 000000000..60904884c --- /dev/null +++ b/website_bkp/assets/pools/sigmapoolcom.svg @@ -0,0 +1,11 @@ + + + SigmaPool + + + + + + + + \ No newline at end of file diff --git a/website_bkp/assets/pools/slushpool.svg b/website_bkp/assets/pools/slushpool.svg new file mode 100644 index 000000000..bcd1f95a8 --- /dev/null +++ b/website_bkp/assets/pools/slushpool.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website_bkp/assets/pools/solopoolcom.svg b/website_bkp/assets/pools/solopoolcom.svg new file mode 100644 index 000000000..25d7f63d0 --- /dev/null +++ b/website_bkp/assets/pools/solopoolcom.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + diff --git a/website_bkp/assets/pools/spiderpool.svg b/website_bkp/assets/pools/spiderpool.svg new file mode 100644 index 000000000..4b60c5fd0 --- /dev/null +++ b/website_bkp/assets/pools/spiderpool.svg @@ -0,0 +1,6 @@ + + +Spiderpool + + + diff --git a/website_bkp/assets/pools/terrapool.svg b/website_bkp/assets/pools/terrapool.svg new file mode 100644 index 000000000..1c9689b0a --- /dev/null +++ b/website_bkp/assets/pools/terrapool.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website_bkp/assets/pools/titan.svg b/website_bkp/assets/pools/titan.svg new file mode 100644 index 000000000..9254ae0ab --- /dev/null +++ b/website_bkp/assets/pools/titan.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/website_bkp/assets/pools/ultimuspool.light.svg b/website_bkp/assets/pools/ultimuspool.light.svg new file mode 100644 index 000000000..4b289314f --- /dev/null +++ b/website_bkp/assets/pools/ultimuspool.light.svg @@ -0,0 +1 @@ + diff --git a/website_bkp/assets/pools/ultimuspool.svg b/website_bkp/assets/pools/ultimuspool.svg new file mode 100644 index 000000000..5cfd6b7f7 --- /dev/null +++ b/website_bkp/assets/pools/ultimuspool.svg @@ -0,0 +1 @@ + diff --git a/website_bkp/assets/pools/unknown.light.svg b/website_bkp/assets/pools/unknown.light.svg new file mode 100644 index 000000000..526d52acd --- /dev/null +++ b/website_bkp/assets/pools/unknown.light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website_bkp/assets/pools/unknown.svg b/website_bkp/assets/pools/unknown.svg new file mode 100644 index 000000000..38b0aa2d6 --- /dev/null +++ b/website_bkp/assets/pools/unknown.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website_bkp/assets/pools/viabtc.svg b/website_bkp/assets/pools/viabtc.svg new file mode 100644 index 000000000..3bacdd51c --- /dev/null +++ b/website_bkp/assets/pools/viabtc.svg @@ -0,0 +1,20 @@ + + + ViaBTC + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website_bkp/assets/pools/wayicn.svg b/website_bkp/assets/pools/wayicn.svg new file mode 100644 index 000000000..b33fa73ff --- /dev/null +++ b/website_bkp/assets/pools/wayicn.svg @@ -0,0 +1,11 @@ + + + easy2mine + + + + + + + + \ No newline at end of file diff --git a/website_bkp/assets/pools/whitepool.light.svg b/website_bkp/assets/pools/whitepool.light.svg new file mode 100644 index 000000000..c85ffd273 --- /dev/null +++ b/website_bkp/assets/pools/whitepool.light.svg @@ -0,0 +1,28 @@ + + + + + + + + diff --git a/website_bkp/assets/pools/whitepool.svg b/website_bkp/assets/pools/whitepool.svg new file mode 100644 index 000000000..1979ce19d --- /dev/null +++ b/website_bkp/assets/pools/whitepool.svg @@ -0,0 +1,28 @@ + + + + + + + + diff --git a/website_bkp/assets/pools/wiz.svg b/website_bkp/assets/pools/wiz.svg new file mode 100644 index 000000000..0fa657732 --- /dev/null +++ b/website_bkp/assets/pools/wiz.svg @@ -0,0 +1,41 @@ + + diff --git a/website_bkp/index.html b/website_bkp/index.html new file mode 100644 index 000000000..8a6b9ce4e --- /dev/null +++ b/website_bkp/index.html @@ -0,0 +1,194 @@ + + + + + bitview + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + + + + + + + + +
+
+ + + diff --git a/website_bkp/jsconfig.json b/website_bkp/jsconfig.json new file mode 100644 index 000000000..ce25d430a --- /dev/null +++ b/website_bkp/jsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "checkJs": true, + "strict": true, + "target": "ESNext", + "module": "ESNext", + "skipLibCheck": true + }, + "exclude": ["assets", "scripts/modules"] +} diff --git a/website_bkp/llms-full.txt b/website_bkp/llms-full.txt new file mode 100644 index 000000000..373f95b62 --- /dev/null +++ b/website_bkp/llms-full.txt @@ -0,0 +1,497 @@ +# Bitcoin Research Kit (BRK) — Full API Reference + +> Free, open-source Bitcoin on-chain analytics API. 49,000+ time-series, block explorer, address index, mempool, mining stats — all computed from a Bitcoin Core node. No auth required. + +Base URL: https://bitview.space +GitHub: https://github.com/bitcoinresearchkit/brk +License: MIT + +## Quick Start + + # Search for series by keyword + curl -s "https://bitview.space/api/series/search?q=price" + + # Get Bitcoin closing price for the last 30 days + curl -s "https://bitview.space/api/series/price/day?start=-30" + + # Get just the latest price + curl -s "https://bitview.space/api/series/price/day/latest" + + # Bulk query multiple series + curl -s "https://bitview.space/api/series/bulk?index=day&series=price,market_cap&start=-7" + + # Get the genesis block + curl -s "https://bitview.space/api/block-height/0" + + # Get an address balance + curl -s "https://bitview.space/api/address/1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa" + + # Get current fee estimates + curl -s "https://bitview.space/api/v1/fees/recommended" + + # Get the live mempool-derived price + curl -s "https://bitview.space/api/mempool/price" + +--- + +## Response Format + +All endpoints return JSON by default. Series endpoints also support CSV via `?format=csv`. + +Errors return: + + { + "error": { + "type": "not_found", + "code": "series_not_found", + "message": "'foo' not found, did you mean 'bar'?", + "doc_url": "/api" + } + } + +Error types: `invalid_request` (400), `forbidden` (403), `not_found` (404), `unavailable` (503), `internal` (500). + +## Range Parameters + +`start` and `end` are optional on all series data endpoints. They accept: +- Dates: `2025-01-01` +- Integers: block height or absolute index +- Negative integers: relative offset from latest (`-30` = last 30 entries) +- ISO 8601 timestamps + +## Indexes + +Series are queryable by time-based and block-based indexes. Common aliases are accepted (e.g. `day` for `day1`, `week` for `week1`). + +Time-based: `minute10`, `minute30`, `hour1`, `hour4`, `hour12`, `day1`, `day3`, `week1`, `month1`, `month3`, `month6`, `year1`, `year10`, `halving`, `epoch` +Block-based: `height` + +Common aliases: `day` = `day1`, `week` = `week1`, `month` = `month1`, `hour` = `hour1`, `h` = `height` + +Not all series support all indexes. Use `GET /api/series/{name}` to see which indexes a series supports. + +--- + +## Server + +### GET https://bitview.space/health + +Health check. + + → {"status": "healthy", "service": "brk", "version": "0.2.1", "indexed_height": 941908, "blocks_behind": 0, "uptime_seconds": 11806, ...} + +### GET https://bitview.space/version + +API version string. + + → "0.2.1" + +### GET https://bitview.space/api/server/sync + +Sync status. + + → {"indexed_height": 941908, "computed_height": 941908, "tip_height": 941908, "blocks_behind": 0, "last_indexed_at": "2026-03-23T19:13:32Z"} + +### GET https://bitview.space/api/server/disk + +Disk usage for BRK data and Bitcoin Core data directories. + +--- + +## Series + +The core feature. 49,000+ on-chain time-series. + +### GET https://bitview.space/api/series/search?q={query} + +Fuzzy search series by name. Returns an array of matching series names. + + → ["price", "price_ath", "price_low", "price_sats", "price_high", "price_ohlc", ...] + +### GET https://bitview.space/api/series/{series}/{index} + +Fetch series data. Parameters: `format` (json|csv), `start`, `end`. + +The `data` array contains raw values. Their position maps to the index range `start..end`. For date-based indexes, compute dates from the index type and position. + + GET /api/series/price/day?start=-3 + → { + "version": 69, + "index": "day1", + "type": "Dollars", + "total": 6291, + "start": 6288, + "end": 6291, + "stamp": "2026-03-23T19:06:40Z", + "data": [70077.35, 68301.76, 70788.45] + } + +Some series return compound values per entry (e.g. OHLC): + + GET /api/series/price_ohlc/day?start=-1 + → { ..., "type": "OHLCDollars", "data": [[68251.03, 71455.61, 67682.26, 70788.45]] } + +CSV format returns the series name as header, then one value per line: + + GET /api/series/price/day?start=-3&format=csv + → price + 70077.35 + 68301.76 + 70788.45 + +### GET https://bitview.space/api/series/{series}/{index}/data + +Raw data array only (no metadata wrapper). Same parameters. + + GET /api/series/price/day/data?start=-3 + → [70077.35, 68301.76, 70788.45] + +### GET https://bitview.space/api/series/{series}/{index}/latest + +Most recent value only. + + GET /api/series/price/day/latest + → 70788.45 + +### GET https://bitview.space/api/series/{series} + +Series metadata: available indexes and value type. + + GET /api/series/price + → { + "indexes": ["minute10", "minute30", "hour1", "hour4", "hour12", + "day1", "day3", "week1", "month1", "month3", "month6", + "year1", "year10", "halving", "epoch", "height"], + "type": "Dollars" + } + +### GET https://bitview.space/api/series + +Full hierarchical catalog of all series as a tree. + +### GET https://bitview.space/api/series/list + +Paginated list of all series. Supports `?page=N` (default 0, 1000 per page). + + → {"current_page": 0, "max_page": 49, "total_count": 49259, "per_page": 1000, "has_more": true, "series": ["fee", "nvt", ...]} + +### GET https://bitview.space/api/series/count + +Series count by category. Returns totals and per-database breakdowns. + +### GET https://bitview.space/api/series/indexes + +List all available indexes with their aliases. + + → [{"index": "day1", "aliases": ["1d", "d", "day", "date", "daily", "day1", "dateindex"]}, ...] + +### GET https://bitview.space/api/series/{series}/{index}/len + +Number of data points in the series. + +### GET https://bitview.space/api/series/{series}/{index}/version + +Version number (increments when data changes). + +### GET https://bitview.space/api/series/bulk?index={index}&series={s1},{s2} + +Fetch multiple series at once. Parameters: `series` (comma-separated, required), `index` (required), `format`, `start`, `end`. + + GET /api/series/bulk?index=day&series=price,market_cap&start=-1 + → [ + {"version": 69, "index": "day1", "type": "Dollars", "total": 6291, "start": 6290, "end": 6291, "stamp": "...", "data": [70788.45]}, + {"version": 83, "index": "day1", "type": "Dollars", "total": 6291, "start": 6290, "end": 6291, "stamp": "...", "data": [1416174345666.71]} + ] + +CSV bulk format uses one column per series: + + GET /api/series/bulk?index=day&series=price,market_cap&start=-1&format=csv + → price,market_cap + 70788.45,1416174345666.71 + +### Cost Basis Distribution + +#### GET https://bitview.space/api/series/cost-basis +List available cohorts. + +#### GET https://bitview.space/api/series/cost-basis/{cohort}/dates +Available snapshot dates for a cohort. + +#### GET https://bitview.space/api/series/cost-basis/{cohort}/{date} +Distribution data. Parameters: `bucket` (raw|lin200|lin500|lin1000|log10|log50|log100), `value` (supply|realized|unrealized). + +--- + +## Blocks + +Mempool.space compatible. + +### GET https://bitview.space/api/block-height/{height} + +Single block by height. + + GET /api/block-height/0 + → { + "id": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f", + "height": 0, + "tx_count": 1, + "size": 285, + "weight": 1140, + "timestamp": 1231006505, + "difficulty": 1.0 + } + +### GET https://bitview.space/api/block/{hash} + +Single block by hash. Same response shape. + +### GET https://bitview.space/api/blocks + +Last 10 blocks. Returns array of block objects. + +### GET https://bitview.space/api/blocks/{height} + +Up to 10 blocks ending at `{height}` (descending). + +### GET https://bitview.space/api/block/{hash}/status + + → {"in_best_chain": true, "height": 916656, "next_best": "0000..."} + +### GET https://bitview.space/api/block/{hash}/txids + +Array of all transaction IDs in the block. + +### GET https://bitview.space/api/block/{hash}/txs/{start_index} + +Paginated transactions in the block. + +### GET https://bitview.space/api/block/{hash}/txid/{index} + +Single txid at position `index`. + +### GET https://bitview.space/api/block/{hash}/raw + +Raw block bytes. + +### GET https://bitview.space/api/v1/mining/blocks/timestamp/{timestamp} + +Block closest to a UNIX timestamp. + +--- + +## Transactions + +Mempool.space compatible. + +### GET https://bitview.space/api/tx/{txid} + +Full transaction data. Values in satoshis (1 BTC = 100,000,000 sats). + + → { + "index": 0, + "txid": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", + "version": 1, + "locktime": 0, + "size": 204, + "weight": 816, + "sigops": 4, + "fee": 0, + "vin": [{ + "txid": "0000000000000000000000000000000000000000000000000000000000000000", + "vout": 65535, + "prevout": null, + "scriptsig": "04ffff001d...", + "scriptsig_asm": "OP_PUSHBYTES_4 ...", + "is_coinbase": true, + "sequence": 4294967295 + }], + "vout": [{ + "scriptpubkey": "4104678a...", + "scriptpubkey_asm": "OP_PUSHBYTES_65 ... OP_CHECKSIG", + "scriptpubkey_type": "p2pk65", + "scriptpubkey_address": "04678afdb0...", + "value": 5000000000 + }], + "status": { + "confirmed": true, + "block_height": 0, + "block_hash": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f", + "block_time": 1231006505 + } + } + +### GET https://bitview.space/api/tx/{txid}/status + + → {"confirmed": true, "block_height": 0, "block_hash": "0000...", "block_time": 1231006505} + +### GET https://bitview.space/api/tx/{txid}/hex + +Raw transaction hex string. + +### GET https://bitview.space/api/tx/{txid}/outspend/{vout} + + → {"spent": true, "txid": "...", "vin": 0, "status": {...}} + +### GET https://bitview.space/api/tx/{txid}/outspends + +Array of spend status for all outputs. + +--- + +## Addresses + +Mempool.space compatible. Supports P2PKH, P2SH, P2WPKH, P2WSH, P2TR. + +### GET https://bitview.space/api/address/{address} + +Address summary. Values in satoshis. + + GET /api/address/1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa + → { + "address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa", + "chain_stats": { + "funded_txo_count": 73262, + "funded_txo_sum": 5715642026, + "spent_txo_count": 0, + "spent_txo_sum": 0, + "tx_count": 62198, + "type_index": 371955 + }, + "mempool_stats": { + "funded_txo_count": 0, + "funded_txo_sum": 0, + "spent_txo_count": 0, + "spent_txo_sum": 0, + "tx_count": 0 + } + } + +### GET https://bitview.space/api/address/{address}/txs + +Transaction history (up to 75 per page). Paginate with `?after_txid={txid}`. + +### GET https://bitview.space/api/address/{address}/txs/chain + +Confirmed transactions only (25 per page). Paginate with `?after_txid={txid}`. + +### GET https://bitview.space/api/address/{address}/txs/mempool + +Unconfirmed transactions (up to 50). + +### GET https://bitview.space/api/address/{address}/utxo + +Unspent outputs. + + → [{"txid": "...", "vout": 0, "status": {...}, "value": 5000000000}] + +### GET https://bitview.space/api/v1/validate-address/{address} + + → {"isvalid": true, "address": "...", "scriptPubKey": "...", "isscript": false, "iswitness": true, "witness_version": 0, "witness_program": "..."} + +--- + +## Mempool + +### GET https://bitview.space/api/mempool/price + +Live BTC/USD price derived from on-chain round-dollar transaction patterns. + + → 70817.64 + +### GET https://bitview.space/api/mempool/info + + → {"count": 24611, "vsize": 2185871, "total_fee": 6250465} + +### GET https://bitview.space/api/mempool/txids + +Array of all transaction IDs in the mempool. + +### GET https://bitview.space/api/v1/fees/recommended + +Fee rate recommendations in sat/vB. + + → {"fastestFee": 3.0, "halfHourFee": 0.135, "hourFee": 0.111, "economyFee": 0.106, "minimumFee": 0.1} + +### GET https://bitview.space/api/v1/fees/mempool-blocks + +Projected mempool blocks. + + → [{"blockSize": 3999892, "blockVSize": 999973.0, "nTx": 3743, "totalFees": 4148496, "medianFee": 3.0, "feeRange": [2.0, 2.0, 2.173, 3.0, 3.965, 5.969, 347.223]}] + +--- + +## Mining + +Mempool.space compatible. Time periods: `24h`, `3d`, `1w`, `1m`, `3m`, `6m`, `1y`, `2y`, `3y`. + +### GET https://bitview.space/api/v1/mining/pools + +All known mining pools. + +### GET https://bitview.space/api/v1/mining/pools/{time_period} + +Pool statistics for a time period. + +### GET https://bitview.space/api/v1/mining/pool/{slug} + +Detailed info for a specific pool. + +### GET https://bitview.space/api/v1/difficulty-adjustment + +Current difficulty epoch: progress, estimated adjustment, remaining blocks/time. + +### GET https://bitview.space/api/v1/mining/difficulty-adjustments + +All historical difficulty adjustments. + +### GET https://bitview.space/api/v1/mining/difficulty-adjustments/{time_period} + +Difficulty adjustments for a given time period. + +### GET https://bitview.space/api/v1/mining/hashrate + +All-time hashrate and difficulty data. + +### GET https://bitview.space/api/v1/mining/hashrate/{time_period} + +Hashrate and difficulty for a given time period. + +### GET https://bitview.space/api/v1/mining/blocks/fees/{time_period} + +Average block fees over time. + +### GET https://bitview.space/api/v1/mining/blocks/rewards/{time_period} + +Average block rewards (subsidy + fees) over time. + +### GET https://bitview.space/api/v1/mining/blocks/sizes-weights/{time_period} + +Average block sizes and weights over time. + +### GET https://bitview.space/api/v1/mining/reward-stats/{block_count} + +Reward statistics for the last N blocks. + +--- + +## Series Categories + +49,000+ series across these categories. Use `/api/series/search?q={keyword}` to discover, or `/api/series` for the full tree. + +- **Market**: price, market_cap, realized_cap, mvrv, nvt, thermocap, and variants (SMA, rolling) +- **Supply**: circulating, issued, inflation_rate, subsidy +- **Mining**: hashrate, difficulty, revenue, fees, block size/weight stats +- **Network activity**: transaction counts, volumes, active addresses +- **UTXO age bands**: HODL waves, realized cap by age cohort +- **Cointime economics**: liveliness, vaultedness, activity-to-vaultedness ratio +- **Holder cohorts**: by balance range (plankton to whale), by holding duration (short/long-term) +- **Cost basis**: UTXO realized price distributions by cohort +- **Addresses**: total, new, active, empty, by balance range, by type + +--- + +## Client Libraries + +- JavaScript: https://www.npmjs.com/package/brk-client +- Python: https://pypi.org/project/brk-client/ +- Rust: https://crates.io/crates/brk_client diff --git a/website_bkp/llms.txt b/website_bkp/llms.txt new file mode 100644 index 000000000..0014d735c --- /dev/null +++ b/website_bkp/llms.txt @@ -0,0 +1,32 @@ +# Bitcoin Research Kit (BRK) + +> Free, open-source Bitcoin on-chain analytics API at https://bitview.space. 49,000+ time-series (price, hashrate, supply, MVRV, HODL waves, and more), block explorer, address index, mempool stats, mining data. No auth required. JSON and CSV output. + +## API Documentation + +- [Full API reference (plain text)](https://bitview.space/llms-full.txt): Every endpoint, parameter, and response shape +- [OpenAPI spec (compact, LLM-optimized)](https://bitview.space/api.json): Machine-readable, minimal spec for tool use +- [OpenAPI spec (full)](https://bitview.space/openapi.json): Complete OpenAPI 3.1 specification +- [Interactive docs](https://bitview.space/api): Scalar API explorer + +## Quick Start + +- [Search series](https://bitview.space/api/series/search?q=price): `GET /api/series/search?q={query}` +- [Get series data](https://bitview.space/api/series/price/day?start=-30): `GET /api/series/{name}/{index}?start=-30` +- [Latest value](https://bitview.space/api/series/price/day/latest): `GET /api/series/{name}/{index}/latest` +- [Bulk query](https://bitview.space/api/series/bulk?index=day&series=price,market_cap&start=-7): `GET /api/series/bulk?index={index}&series={s1},{s2}` +- [Block by height](https://bitview.space/api/block-height/0): `GET /api/block-height/{height}` +- [Transaction](https://bitview.space/api/tx/4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b): `GET /api/tx/{txid}` +- [Address](https://bitview.space/api/address/1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa): `GET /api/address/{address}` +- [Fee estimates](https://bitview.space/api/v1/fees/recommended): `GET /api/v1/fees/recommended` +- [Live price](https://bitview.space/api/mempool/price): `GET /api/mempool/price` + +## Client Libraries + +- [JavaScript](https://www.npmjs.com/package/brk-client): npm install brk-client +- [Python](https://pypi.org/project/brk-client/): pip install brk-client +- [Rust](https://crates.io/crates/brk_client): cargo add brk_client + +## Source + +- [GitHub](https://github.com/bitcoinresearchkit/brk): MIT licensed diff --git a/website_bkp/manifest.webmanifest b/website_bkp/manifest.webmanifest new file mode 100644 index 000000000..e4b2ee912 --- /dev/null +++ b/website_bkp/manifest.webmanifest @@ -0,0 +1,43 @@ +{ + "name": "bitview", + "short_name": "bitview", + "description": "Bitcoin transparency, amplified", + "categories": [ + "bitcoin", + "on-chain", + "data" + ], + "start_url": "/", + "scope": "/", + "display": "standalone", + "handle_links": "preferred", + "theme_color": "#f26610", + "background_color": "#f26610", + "lang": "en", + "icons": [ + { + "src": "/assets/favicon/web-app-manifest-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/assets/favicon/web-app-manifest-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/assets/favicon/web-app-manifest-512x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/assets/favicon/web-app-manifest-512x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/website_bkp/robots.txt b/website_bkp/robots.txt new file mode 100644 index 000000000..1c69058fb --- /dev/null +++ b/website_bkp/robots.txt @@ -0,0 +1,9 @@ +User-agent: * +Allow: / + +# LLM-friendly resources +# llms.txt: https://llmstxt.org/ +# llms-full.txt: Complete API reference for LLM ingestion +# api.json: Compact OpenAPI spec optimized for LLM consumption +Sitemap: https://bitview.space/llms.txt +Sitemap: https://bitview.space/llms-full.txt \ No newline at end of file diff --git a/website/scripts/_types.js b/website_bkp/scripts/_types.js similarity index 100% rename from website/scripts/_types.js rename to website_bkp/scripts/_types.js diff --git a/website_bkp/scripts/entry.js b/website_bkp/scripts/entry.js new file mode 100644 index 000000000..3ef381e09 --- /dev/null +++ b/website_bkp/scripts/entry.js @@ -0,0 +1 @@ +import "./main.js"; diff --git a/website/scripts/explorer/address.js b/website_bkp/scripts/explorer/address.js similarity index 100% rename from website/scripts/explorer/address.js rename to website_bkp/scripts/explorer/address.js diff --git a/website/scripts/explorer/block.js b/website_bkp/scripts/explorer/block.js similarity index 100% rename from website/scripts/explorer/block.js rename to website_bkp/scripts/explorer/block.js diff --git a/website/scripts/explorer/chain.js b/website_bkp/scripts/explorer/chain.js similarity index 100% rename from website/scripts/explorer/chain.js rename to website_bkp/scripts/explorer/chain.js diff --git a/website/scripts/explorer/cube.js b/website_bkp/scripts/explorer/cube.js similarity index 100% rename from website/scripts/explorer/cube.js rename to website_bkp/scripts/explorer/cube.js diff --git a/website/scripts/explorer/index.js b/website_bkp/scripts/explorer/index.js similarity index 100% rename from website/scripts/explorer/index.js rename to website_bkp/scripts/explorer/index.js diff --git a/website/scripts/explorer/mempool.js b/website_bkp/scripts/explorer/mempool.js similarity index 100% rename from website/scripts/explorer/mempool.js rename to website_bkp/scripts/explorer/mempool.js diff --git a/website/scripts/explorer/render.js b/website_bkp/scripts/explorer/render.js similarity index 100% rename from website/scripts/explorer/render.js rename to website_bkp/scripts/explorer/render.js diff --git a/website/scripts/explorer/tx.js b/website_bkp/scripts/explorer/tx.js similarity index 100% rename from website/scripts/explorer/tx.js rename to website_bkp/scripts/explorer/tx.js diff --git a/website/scripts/main.js b/website_bkp/scripts/main.js similarity index 100% rename from website/scripts/main.js rename to website_bkp/scripts/main.js diff --git a/website_bkp/scripts/modules/.gitignore b/website_bkp/scripts/modules/.gitignore new file mode 100644 index 000000000..46ff68222 --- /dev/null +++ b/website_bkp/scripts/modules/.gitignore @@ -0,0 +1,14 @@ +LICENSE +**/*.*.*/*.json +*webcomponent* +cli* +extras/ +*.cjs +dev.js +*.development* +*.iife.* +nano.* +worker.* +*.mts +*.cts +*.rs diff --git a/website_bkp/scripts/modules/brk-client/.gitignore b/website_bkp/scripts/modules/brk-client/.gitignore new file mode 100644 index 000000000..86d4c2dd3 --- /dev/null +++ b/website_bkp/scripts/modules/brk-client/.gitignore @@ -0,0 +1 @@ +generated diff --git a/website_bkp/scripts/modules/brk-client/index.js b/website_bkp/scripts/modules/brk-client/index.js new file mode 100644 index 000000000..93d9c27bc --- /dev/null +++ b/website_bkp/scripts/modules/brk-client/index.js @@ -0,0 +1,12226 @@ +// Auto-generated BRK JavaScript client +// Do not edit manually + +// Type definitions + +/** + * Bitcoin address string + * + * @typedef {string} Addr + */ +/** + * Bitcoin address + last-seen txid path parameters (Esplora-style pagination) + * + * @typedef {Object} AddrAfterTxidParam + * @property {Addr} address + * @property {Txid} afterTxid - Last txid from the previous page (return transactions strictly older than this) + */ +/** + * Address statistics on the blockchain (confirmed transactions only) + * + * Based on mempool.space's format with type_index extension. + * + * @typedef {Object} AddrChainStats + * @property {number} fundedTxoCount - Total number of transaction outputs that funded this address + * @property {Sats} fundedTxoSum - Total amount in satoshis received by this address across all funded outputs + * @property {number} spentTxoCount - Total number of transaction outputs spent from this address + * @property {Sats} spentTxoSum - Total amount in satoshis spent from this address + * @property {number} txCount - Total number of confirmed transactions involving this address + * @property {TypeIndex} typeIndex - Index of this address within its type on the blockchain + * @property {Dollars} realizedPrice - Realized price (average cost basis) in USD + */ +/** + * Address statistics in the mempool (unconfirmed transactions only) + * + * Based on mempool.space's format. + * + * @typedef {Object} AddrMempoolStats + * @property {number} fundedTxoCount - Number of unconfirmed transaction outputs funding this address + * @property {Sats} fundedTxoSum - Total amount in satoshis being received in unconfirmed transactions + * @property {number} spentTxoCount - Number of unconfirmed transaction inputs spending from this address + * @property {Sats} spentTxoSum - Total amount in satoshis being spent in unconfirmed transactions + * @property {number} txCount - Number of unconfirmed transactions involving this address + */ +/** + * Bitcoin address path parameter + * + * @typedef {Object} AddrParam + * @property {Addr} address + */ +/** + * Address information compatible with mempool.space API format + * + * @typedef {Object} AddrStats + * @property {Addr} address - Bitcoin address string + * @property {OutputType} addrType - Address type (p2pkh, p2sh, v0_p2wpkh, v0_p2wsh, v1_p2tr, etc.) + * @property {AddrChainStats} chainStats - Statistics for confirmed transactions on the blockchain + * @property {AddrMempoolStats} mempoolStats - Statistics for unconfirmed transactions in the mempool + */ +/** + * Address validation result + * + * @typedef {Object} AddrValidation + * @property {boolean} isvalid - Whether the address is valid + * @property {?string=} address - The validated address + * @property {?string=} scriptPubKey - The scriptPubKey in hex + * @property {?boolean=} isscript - Whether this is a script address (P2SH) + * @property {?boolean=} iswitness - Whether this is a witness address + * @property {?number=} witnessVersion - Witness version (0 for P2WPKH/P2WSH, 1 for P2TR) + * @property {?string=} witnessProgram - Witness program in hex + * @property {?number[]=} errorLocations - Error locations (empty array for most errors) + * @property {?string=} error - Error message for invalid addresses + */ +/** + * Unified index for any address type (funded or empty) + * + * @typedef {TypeIndex} AnyAddrIndex + */ +/** + * Unsigned basis points stored as u16. + * 1 bp = 0.0001. Range: 0–6.5535. + * Use for bounded 0–1 ratios (dominance, adoption, liveliness, etc.). + * `u16::MAX` is reserved as a NaN sentinel. + * + * @typedef {number} BasisPoints16 + */ +/** + * Unsigned basis points stored as u32. + * 1 bp = 0.0001. Range: 0–429,496.7295. + * Use for unbounded unsigned ratios (MVRV, NVT, SOPR, etc.). + * `u32::MAX` is reserved as a NaN sentinel. + * + * @typedef {number} BasisPoints32 + */ +/** + * Signed basis points stored as i16. + * 1 bp = 0.0001. Range: -3.2767 to +3.2767. + * Use for signed bounded ratios (NUPL, net PnL ratios, etc.). + * `i16::MIN` is reserved as a NaN sentinel. + * + * @typedef {number} BasisPointsSigned16 + */ +/** + * Signed basis points stored as i32. + * 1 bp = 0.0001. Range: -214,748.3647 to +214,748.3647. + * Use for unbounded signed values (returns, growth rates, volatility, z-scores, etc.). + * `i32::MIN` is reserved as a NaN sentinel. + * + * @typedef {number} BasisPointsSigned32 + */ +/** + * Bitcoin amount as floating point (1 BTC = 100,000,000 satoshis) + * + * @typedef {number} Bitcoin + */ +/** + * Block count path parameter + * + * @typedef {Object} BlockCountParam + * @property {number} blockCount - Number of recent blocks to include + */ +/** + * Extended block data matching mempool.space /api/v1/blocks extras + * + * @typedef {Object} BlockExtras + * @property {Sats} totalFees - Total fees in satoshis + * @property {FeeRate} medianFee - Median fee rate in sat/vB + * @property {FeeRate[]} feeRange - Fee rate range: [min, 10%, 25%, 50%, 75%, 90%, max] + * @property {Sats} reward - Total block reward (subsidy + fees) in satoshis + * @property {BlockPool} pool - Mining pool that mined this block + * @property {Sats} avgFee - Average fee per transaction in satoshis + * @property {FeeRate} avgFeeRate - Average fee rate in sat/vB + * @property {string} coinbaseRaw - Raw coinbase transaction scriptsig as hex + * @property {?string=} coinbaseAddress - Primary coinbase output address + * @property {string[]} coinbaseAddresses - All coinbase output addresses + * @property {string} coinbaseSignature - Coinbase output script in ASM format + * @property {string} coinbaseSignatureAscii - Coinbase scriptsig decoded as ASCII + * @property {number} avgTxSize - Average transaction size in bytes + * @property {number} totalInputs - Total number of inputs (excluding coinbase) + * @property {number} totalOutputs - Total number of outputs + * @property {Sats} totalOutputAmt - Total output amount in satoshis + * @property {Sats} medianFeeAmt - Median fee amount in satoshis + * @property {Sats[]} feePercentiles - Fee amount percentiles in satoshis: [min, 10%, 25%, 50%, 75%, 90%, max] + * @property {number} segwitTotalTxs - Number of segwit transactions + * @property {number} segwitTotalSize - Total size of segwit transactions in bytes + * @property {Weight} segwitTotalWeight - Total weight of segwit transactions + * @property {string} header - Raw 80-byte block header as hex + * @property {number} utxoSetChange - UTXO set change (total outputs - total inputs, includes unspendable like OP_RETURN). +Note: intentionally differs from utxo_set_size diff which excludes unspendable outputs. +Matches mempool.space/bitcoin-cli behavior. + * @property {number} utxoSetSize - Total spendable UTXO set size at this height (excludes OP_RETURN and other unspendable outputs) + * @property {Sats} totalInputAmt - Total input amount in satoshis + * @property {number} virtualSize - Virtual size in vbytes + * @property {?number=} firstSeen - Timestamp when the block was first seen (always null, not yet supported) + * @property {string[]} orphans - Orphaned blocks (always empty) + * @property {Dollars} price - USD price at block height + */ +/** + * A single block fee rates data point with percentiles. + * + * @typedef {Object} BlockFeeRatesEntry + * @property {Height} avgHeight - Average block height in this window + * @property {Timestamp} timestamp - Unix timestamp at the window midpoint + * @property {FeeRate} avgFee0 - Minimum fee rate (sat/vB) + * @property {FeeRate} avgFee10 - 10th percentile fee rate (sat/vB) + * @property {FeeRate} avgFee25 - 25th percentile fee rate (sat/vB) + * @property {FeeRate} avgFee50 - Median fee rate (sat/vB) + * @property {FeeRate} avgFee75 - 75th percentile fee rate (sat/vB) + * @property {FeeRate} avgFee90 - 90th percentile fee rate (sat/vB) + * @property {FeeRate} avgFee100 - Maximum fee rate (sat/vB) + */ +/** + * A single block fees data point. + * + * @typedef {Object} BlockFeesEntry + * @property {Height} avgHeight - Average block height in this window + * @property {Timestamp} timestamp - Unix timestamp at the window midpoint + * @property {Sats} avgFees - Average fees per block in this window (sats) + * @property {Dollars} uSD - BTC/USD price at this height + */ +/** + * Block hash + * + * @typedef {string} BlockHash + */ +/** + * Block hash path parameter + * + * @typedef {Object} BlockHashParam + * @property {BlockHash} hash + */ +/** + * Block hash + starting transaction index path parameters + * + * @typedef {Object} BlockHashStartIndex + * @property {BlockHash} hash - Bitcoin block hash + * @property {BlockTxIndex} startIndex - Starting transaction index within the block (0-based) + */ +/** + * Block hash + transaction index path parameters + * + * @typedef {Object} BlockHashTxIndex + * @property {BlockHash} hash - Bitcoin block hash + * @property {BlockTxIndex} index - Transaction index within the block (0-based) + */ +/** + * Block information matching mempool.space /api/block/{hash} + * + * @typedef {Object} BlockInfo + * @property {BlockHash} id - Block hash + * @property {Height} height - Block height + * @property {number} version - Block version + * @property {Timestamp} timestamp - Block timestamp (Unix time) + * @property {number} bits - Compact target (bits) + * @property {number} nonce - Nonce + * @property {number} difficulty - Block difficulty + * @property {string} merkleRoot - Merkle root of the transaction tree + * @property {number} txCount - Number of transactions + * @property {number} size - Block size in bytes + * @property {Weight} weight - Block weight in weight units + * @property {BlockHash} previousblockhash - Previous block hash + * @property {Timestamp} mediantime - Median time of the last 11 blocks + */ +/** + * Block information with extras, matching mempool.space /api/v1/blocks + * + * @typedef {Object} BlockInfoV1 + * @property {BlockHash} id - Block hash + * @property {Height} height - Block height + * @property {number} version - Block version + * @property {Timestamp} timestamp - Block timestamp (Unix time) + * @property {number} bits - Compact target (bits) + * @property {number} nonce - Nonce + * @property {number} difficulty - Block difficulty + * @property {string} merkleRoot - Merkle root of the transaction tree + * @property {number} txCount - Number of transactions + * @property {number} size - Block size in bytes + * @property {Weight} weight - Block weight in weight units + * @property {BlockHash} previousblockhash - Previous block hash + * @property {Timestamp} mediantime - Median time of the last 11 blocks + * @property {boolean=} stale - Whether this block has been replaced by a longer chain + * @property {BlockExtras} extras - Extended block data + */ +/** + * Mining pool identification for a block + * + * @typedef {Object} BlockPool + * @property {number} id - Unique pool identifier + * @property {string} name - Pool name + * @property {PoolSlug} slug - URL-friendly pool identifier + * @property {?string[]=} minerNames - Miner name tags found in coinbase scriptsig + */ +/** + * A single block rewards data point. + * + * @typedef {Object} BlockRewardsEntry + * @property {Height} avgHeight - Average block height in this window + * @property {Timestamp} timestamp - Unix timestamp at the window midpoint + * @property {Sats} avgRewards - Average coinbase reward per block (subsidy + fees, sats) + * @property {Dollars} uSD - BTC/USD price at this height + */ +/** + * A single block size data point. + * + * @typedef {Object} BlockSizeEntry + * @property {Height} avgHeight - Average block height in this window + * @property {Timestamp} timestamp - Unix timestamp at the window midpoint + * @property {number} avgSize - Rolling 24h median block size (bytes) + */ +/** + * Combined block sizes and weights response. + * + * @typedef {Object} BlockSizesWeights + * @property {BlockSizeEntry[]} sizes - Block size data points + * @property {BlockWeightEntry[]} weights - Block weight data points + */ +/** + * Block status indicating whether block is in the best chain + * + * @typedef {Object} BlockStatus + * @property {boolean} inBestChain - Whether this block is in the best chain + * @property {(Height|null)=} height - Block height (only if in best chain) + * @property {(BlockHash|null)=} nextBest - Hash of the next block in the best chain (null if tip) + */ +/** + * Projected next-block contents from Bitcoin Core's `getblocktemplate` + * (block 0 of the snapshot). Returned by + * `GET /api/v1/mempool/block-template`. + * + * @typedef {Object} BlockTemplate + * @property {NextBlockHash} hash - Pass back as `` on +`/api/v1/mempool/block-template/diff/{hash}` to fetch deltas. + * @property {MempoolBlock} stats - Aggregate stats for this block (size, vsize, fee range, ...). + * @property {Transaction[]} transactions - Full transaction bodies in `getblocktemplate` order. + */ +/** + * Delta between the current `getblocktemplate` projection and a prior + * one identified by `since`. Returned by + * `GET /api/v1/mempool/block-template/diff/{hash}`. + * + * `order` carries the full new template in template order: each entry + * is either a `Retained(idx)` pointing into the prior template (which + * the client cached at `since`) or a `New(tx)` inline body. Walk it + * once to rebuild the new template; no separate `added` array to + * cross-reference. + * + * `removed` is redundant (computable from `order` by collecting prior + * indices that don't appear) but shipped for cache-eviction ergonomics. + * + * @typedef {Object} BlockTemplateDiff + * @property {NextBlockHash} hash - Current next-block hash. Use as `since` on the next diff call. + * @property {NextBlockHash} since - Echoed prior hash the diff was computed against. + * @property {BlockTemplateDiffEntry[]} order - New template in order. Each entry is either an index into the +prior template's transactions or a full transaction body. + * @property {Txid[]} removed - Txids that left the projected next block since `since` +(confirmed, evicted, replaced, or pushed past block 0). + */ +/** + * One slot of the new template in a `BlockTemplateDiff`. + * + * Untagged on the wire so JSON type disambiguates the variants: + * - `Retained(idx)` serializes as a bare integer - index into the + * transactions of the prior template (which the client cached at + * `since`). + * - `New(tx)` serializes as a transaction object - a body that was + * not in the prior template and must be added at this position. + * + * Reconstruction is a single pass: for each entry, either copy + * `prior[idx]` or append the inline body. + * + * @typedef {(number|Transaction)} BlockTemplateDiffEntry + */ +/** + * Block information returned for timestamp queries + * + * @typedef {Object} BlockTimestamp + * @property {Height} height - Block height + * @property {BlockHash} hash - Block hash + * @property {string} timestamp - Block timestamp in ISO 8601 format + */ +/** + * Position of a transaction within a single block (0 = coinbase). + * Distinct from `TxIndex`, which is the chain-wide global tx index. + * + * @typedef {number} BlockTxIndex + */ +/** + * A single block weight data point. + * + * @typedef {Object} BlockWeightEntry + * @property {Height} avgHeight - Average block height in this window + * @property {Timestamp} timestamp - Unix timestamp at the window midpoint + * @property {Weight} avgWeight - Rolling 24h median block weight (weight units) + */ +/** + * Unsigned cents (u64) - for values that should never be negative. + * Used for invested capital, realized cap, etc. + * + * @typedef {number} Cents + */ +/** + * Cents × Sats (u128) - price in cents multiplied by amount in sats. + * Uses u128 because large amounts at any price can overflow u64. + * + * @typedef {number} CentsSats + */ +/** + * Signed cents (i64) - for values that can be negative. + * Used for profit/loss calculations, deltas, etc. + * + * @typedef {number} CentsSigned + */ +/** + * Raw cents squared (u128) - stores cents² × sats without division. + * Used for precise accumulation of capitalized cap values: Σ(price² × sats). + * capitalized_price = capitalized_cap_raw / realized_cap_raw + * + * @typedef {number} CentsSquaredSats + */ +/** + * Closing price value for a time period + * + * @typedef {Dollars} Close + */ +/** + * URPD cohort identifier. Use `GET /api/urpd` to list available cohorts. + * + * Validated at construction: non-empty, ASCII `[a-z0-9_]+`. Matches the + * schemars enum value set; the type therefore proves "this is a valid + * cohort name" wherever a `Cohort` is held. + * + * @typedef {("all"|"sth"|"lth"|"utxos_under_1h_old"|"utxos_1h_to_1d_old"|"utxos_1d_to_1w_old"|"utxos_1w_to_1m_old"|"utxos_1m_to_2m_old"|"utxos_2m_to_3m_old"|"utxos_3m_to_4m_old"|"utxos_4m_to_5m_old"|"utxos_5m_to_6m_old"|"utxos_6m_to_1y_old"|"utxos_1y_to_2y_old"|"utxos_2y_to_3y_old"|"utxos_3y_to_4y_old"|"utxos_4y_to_5y_old"|"utxos_5y_to_6y_old"|"utxos_6y_to_7y_old"|"utxos_7y_to_8y_old"|"utxos_8y_to_10y_old"|"utxos_10y_to_12y_old"|"utxos_12y_to_15y_old"|"utxos_over_15y_old")} Cohort + */ +/** + * Coinbase scriptSig tag for pool identification. + * + * Stored as a fixed 101-byte record (1 byte length + 100 bytes data). + * Uses `[u8; 101]` internally so that `size_of::()` matches + * the serialized `Bytes::Array` size (vecdb requires this for alignment). + * + * Bitcoin consensus limits coinbase scriptSig to 2-100 bytes. + * + * @typedef {string} CoinbaseTag + */ +/** + * @typedef {Object} CostBasisCohortParam + * @property {Cohort} cohort + */ +/** + * @typedef {Object} CostBasisParams + * @property {Cohort} cohort + * @property {string} date + */ +/** + * @typedef {Object} CostBasisQuery + * @property {UrpdAggregation=} bucket + * @property {CostBasisValue=} value + */ +/** + * Value type for the deprecated cost-basis distribution output. + * + * @typedef {("supply"|"realized"|"unrealized")} CostBasisValue + */ +/** + * CPFP cluster: the connected component the seed belongs to, plus its + * SFL linearization. + * + * @typedef {Object} CpfpCluster + * @property {CpfpClusterTx[]} txs - All txs in the cluster, in topological order (parents before children). + * @property {CpfpClusterChunk[]} chunks - SFL-emitted chunks ordered by descending feerate. + * @property {number} chunkIndex - Index into `chunks` of the chunk containing the seed tx. + */ +/** + * One SFL chunk inside a `CpfpCluster`. `txs` is in topological order + * (matches `CpfpCluster.txs` ordering); the chunk's `feerate` is the + * per-chunk SFL feerate and is the same for every tx in this chunk. + * + * @typedef {Object} CpfpClusterChunk + * @property {CpfpClusterTxIndex[]} txs + * @property {FeeRate} feerate + */ +/** + * One entry in a `CpfpCluster.txs` array. + * + * @typedef {Object} CpfpClusterTx + * @property {Txid} txid + * @property {Weight} weight + * @property {Sats} fee + * @property {CpfpClusterTxIndex[]} parents - In-cluster parents of this tx. + */ +/** + * Position of a transaction inside a `CpfpCluster.txs` array. Cluster-local, + * has no meaning outside the enclosing cluster. + * + * @typedef {number} CpfpClusterTxIndex + */ +/** + * A transaction in a CPFP relationship. + * + * @typedef {Object} CpfpEntry + * @property {Txid} txid + * @property {Weight} weight + * @property {Sats} fee + */ +/** + * CPFP (Child Pays For Parent) information for a transaction. + * + * @typedef {Object} CpfpInfo + * @property {CpfpEntry[]} ancestors - Ancestor transactions in the CPFP chain. + * @property {(CpfpEntry|null)=} bestDescendant - Best (highest fee rate) descendant, if any. + * @property {CpfpEntry[]} descendants - Descendant transactions in the CPFP chain. + * @property {FeeRate} effectiveFeePerVsize - Effective fee rate considering CPFP relationships (sat/vB). +This is the seed's chunk feerate after lift-merging, i.e. the +rate Core/mempool.space would surface for this tx. + * @property {SigOps} sigops - BIP-141 sigop cost for the seed tx (witness sigops count as 1, +legacy and P2SH-redeem sigops count as 4). + * @property {Sats} fee - Transaction fee (sats). + * @property {VSize} vsize - Virtual size of the seed tx (vbytes). + * @property {VSize} adjustedVsize - Policy-adjusted virtual size: `max(vsize, sigops * 5)`. + * @property {(CpfpCluster|null)=} cluster - Cluster the seed belongs to: full tx list, SFL-linearized chunks, +and the seed's chunk index. Omitted when the seed has no +ancestors and no descendants (matches mempool.space). + */ +/** + * Range parameters with output format for API query parameters. + * + * @typedef {Object} DataRangeFormat + * @property {(RangeIndex|null)=} start - Inclusive start: integer index, date (YYYY-MM-DD), or timestamp (ISO 8601). Negative integers count from end. Aliases: `from`, `f`, `s` + * @property {(RangeIndex|null)=} end - Exclusive end: integer index, date (YYYY-MM-DD), or timestamp (ISO 8601). Negative integers count from end. Aliases: `to`, `t`, `e` + * @property {(Limit|null)=} limit - Maximum number of values to return (ignored if `end` is set). Aliases: `count`, `c`, `l` + * @property {Format=} format - Format of the output + */ +/** + * Date in YYYYMMDD format stored as u32 + * + * @typedef {number} Date + */ +/** @typedef {number} Day1 */ +/** @typedef {number} Day3 */ +/** + * Detailed series count with per-database breakdown + * + * @typedef {Object} DetailedSeriesCount + * @property {number} distinctSeries - Number of unique series available (e.g., realized_price, market_cap) + * @property {number} totalEndpoints - Total number of series-index combinations across all timeframes + * @property {number} lazyEndpoints - Number of lazy (computed on-the-fly) series-index combinations + * @property {number} storedEndpoints - Number of eager (stored on disk) series-index combinations + * @property {{ [key: string]: SeriesCount }} byDb - Per-database breakdown of counts + */ +/** + * Difficulty adjustment information. + * + * @typedef {Object} DifficultyAdjustment + * @property {number} progressPercent - Progress through current difficulty epoch (0-100%) + * @property {number} difficultyChange - Estimated difficulty change at next retarget (%) + * @property {number} estimatedRetargetDate - Estimated timestamp of next retarget (milliseconds) + * @property {number} remainingBlocks - Blocks remaining until retarget + * @property {number} remainingTime - Estimated time until retarget (milliseconds) + * @property {number} previousRetarget - Previous difficulty adjustment (%) + * @property {Timestamp} previousTime - Timestamp of most recent retarget (seconds) + * @property {Height} nextRetargetHeight - Height of next retarget + * @property {number} timeAvg - Average block time in current epoch (milliseconds) + * @property {number} adjustedTimeAvg - Time-adjusted average (milliseconds) + * @property {number} timeOffset - Time offset from expected schedule (seconds) + * @property {number} expectedBlocks - Expected blocks based on wall clock time since epoch start + */ +/** + * A single difficulty adjustment entry. + * Serializes as array: [timestamp, height, difficulty, change_percent] + * + * @typedef {Object} DifficultyAdjustmentEntry + * @property {Timestamp} timestamp - Unix timestamp of the adjustment + * @property {Height} height - Block height of the adjustment + * @property {number} difficulty - Difficulty value + * @property {number} changePercent - Adjustment ratio (new/previous, e.g. 1.068 = +6.8%) + */ +/** + * A single difficulty data point in the hashrate summary. + * + * @typedef {Object} DifficultyEntry + * @property {Timestamp} time - Unix timestamp of the difficulty adjustment + * @property {Height} height - Block height of the adjustment + * @property {number} difficulty - Difficulty value + * @property {number} adjustment - Adjustment ratio (new/previous, e.g. 1.068 = +6.8%) + */ +/** + * Disk usage of the indexed data + * + * @typedef {Object} DiskUsage + * @property {string} brk - Human-readable brk data size (e.g., "48.8 GiB") + * @property {number} brkBytes - brk data size in bytes + * @property {string} bitcoin - Human-readable Bitcoin blocks directory size + * @property {number} bitcoinBytes - Bitcoin blocks directory size in bytes + * @property {number} ratio - brk as percentage of Bitcoin data + */ +/** + * US Dollar amount + * + * @typedef {number} Dollars + */ +/** + * Data of an empty address + * + * @typedef {Object} EmptyAddrData + * @property {number} txCount - Total transaction count + * @property {number} fundedTxoCount - Total funded/spent transaction output count (equal since address is empty) + * @property {Sats} transfered - Total satoshis transferred + */ +/** @typedef {TypeIndex} EmptyAddrIndex */ +/** @typedef {TypeIndex} EmptyOutputIndex */ +/** @typedef {number} Epoch */ +/** + * @typedef {Object} ErrorBody + * @property {ErrorDetail} error + */ +/** + * @typedef {Object} ErrorDetail + * @property {string} type - Error category: "invalid_request", "forbidden", "not_found", "unavailable", or "internal" + * @property {string} code - Machine-readable error code (e.g. "invalid_addr", "series_not_found") + * @property {string} message - Human-readable description + * @property {string} docUrl - Link to API documentation + */ +/** + * Exchange rates (USD base, on-chain only — no fiat pairs available) + * + * @typedef {Object} ExchangeRates + */ +/** + * Fee rate in sat/vB + * + * @typedef {number} FeeRate + */ +/** + * Output format for API responses + * + * @typedef {("json"|"csv")} Format + */ +/** + * Data for a funded (non-empty) address with current balance + * + * @typedef {Object} FundedAddrData + * @property {number} txCount - Total transaction count + * @property {number} fundedTxoCount - Number of transaction outputs funded to this address + * @property {number} spentTxoCount - Number of transaction outputs spent by this address + * @property {Sats} received - Satoshis received by this address + * @property {Sats} sent - Satoshis sent by this address + * @property {CentsSats} realizedCapRaw - The realized capitalization: Σ(price × sats) + * @property {CentsSquaredSats} capitalizedCapRaw - The capitalized cap: Σ(price² × sats) + */ +/** @typedef {TypeIndex} FundedAddrIndex */ +/** @typedef {number} Halving */ +/** + * A single hashrate data point. + * + * @typedef {Object} HashrateEntry + * @property {Timestamp} timestamp - Unix timestamp + * @property {number} avgHashrate - Average hashrate (H/s) + */ +/** + * Summary of network hashrate and difficulty data. + * + * @typedef {Object} HashrateSummary + * @property {HashrateEntry[]} hashrates - Historical hashrate data points + * @property {DifficultyEntry[]} difficulty - Historical difficulty adjustments + * @property {number} currentHashrate - Current network hashrate (H/s) + * @property {number} currentDifficulty - Current network difficulty + */ +/** + * Server health status + * + * @typedef {Object} Health + * @property {string} status - Health status ("healthy") + * @property {string} service - Service name + * @property {string} version - Server version + * @property {string} timestamp - Current server time (ISO 8601) + * @property {string} startedAt - Server start time (ISO 8601) + * @property {number} uptimeSeconds - Uptime in seconds + * @property {Height} indexedHeight - Height of the last indexed block + * @property {Height} computedHeight - Height of the last computed block (series) + * @property {Height} tipHeight - Height of the chain tip (from Bitcoin node) + * @property {Height} blocksBehind - Number of blocks behind the tip + * @property {string} lastIndexedAt - Human-readable timestamp of the last indexed block (ISO 8601) + * @property {Timestamp} lastIndexedAtUnix - Unix timestamp of the last indexed block + */ +/** + * Block height + * + * @typedef {number} Height + */ +/** + * Path parameter accepting either a block height (`840000`) or a calendar date + * (`YYYY-MM-DD`). The handler resolves it and dispatches to the per-height or + * per-day variant, choosing the matching cache strategy. + * + * @typedef {Object} HeightOrDateParam + * @property {string} point + */ +/** + * Block height path parameter + * + * @typedef {Object} HeightParam + * @property {Height} height + */ +/** + * Hex-encoded string. Transparent wrapper over `String`: serializes + * as a plain JSON string and derefs to `str`, so anywhere `&str` or + * `AsRef<[u8]>` is expected the `Hex` "just works". + * + * @typedef {string} Hex + */ +/** + * Highest price value for a time period + * + * @typedef {Dollars} High + */ +/** + * Historical price response + * + * @typedef {Object} HistoricalPrice + * @property {HistoricalPriceEntry[]} prices - Price data points + * @property {ExchangeRates} exchangeRates - Exchange rates (currently empty) + */ +/** + * A single price data point + * + * @typedef {Object} HistoricalPriceEntry + * @property {Timestamp} time - Unix timestamp + * @property {Dollars} uSD - BTC/USD price + */ +/** @typedef {number} Hour1 */ +/** @typedef {number} Hour12 */ +/** @typedef {number} Hour4 */ +/** + * Aggregation dimension for querying series. Includes time-based (date, week, month, year), + * block-based (height, tx_index), and address/output type indexes. + * + * @typedef {("minute10"|"minute30"|"hour1"|"hour4"|"hour12"|"day1"|"day3"|"week1"|"month1"|"month3"|"month6"|"year1"|"year10"|"halving"|"epoch"|"height"|"tx_index"|"txin_index"|"txout_index"|"empty_output_index"|"op_return_index"|"p2a_addr_index"|"p2ms_output_index"|"p2pk33_addr_index"|"p2pk65_addr_index"|"p2pkh_addr_index"|"p2sh_addr_index"|"p2tr_addr_index"|"p2wpkh_addr_index"|"p2wsh_addr_index"|"unknown_output_index"|"funded_addr_index"|"empty_addr_index")} Index + */ +/** + * Information about an available index and its query aliases + * + * @typedef {Object} IndexInfo + * @property {Index} index - The canonical index name + * @property {string[]} aliases - All Accepted query aliases + */ +/** + * Legacy path parameter for `/api/metric/{metric}` + * + * @typedef {Object} LegacySeriesParam + * @property {SeriesName} metric + */ +/** + * Legacy path parameters for `/api/metric/{metric}/{index}` + * + * @typedef {Object} LegacySeriesWithIndex + * @property {SeriesName} metric + * @property {Index} index + */ +/** + * Maximum number of results to return. Defaults to 100 if not specified. + * + * @typedef {number} Limit + */ +/** + * Lowest price value for a time period + * + * @typedef {Dollars} Low + */ +/** + * Block info in a mempool.space like format for fee estimation. + * + * @typedef {Object} MempoolBlock + * @property {number} blockSize - Total serialized block size in bytes (witness + non-witness). + * @property {number} blockVSize - Total block virtual size in vbytes + * @property {number} nTx - Number of transactions in the projected block + * @property {Sats} totalFees - Total fees in satoshis + * @property {FeeRate} medianFee - Median fee rate in sat/vB + * @property {FeeRate[]} feeRange - Fee rate range: [min, 10%, 25%, 50%, 75%, 90%, max] + */ +/** + * Mempool statistics with incrementally maintained fee histogram. + * + * @typedef {Object} MempoolInfo + * @property {number} count - Number of transactions in the mempool + * @property {VSize} vsize - Total virtual size of all transactions in the mempool (vbytes) + * @property {Sats} totalFee - Total fees of all transactions in the mempool (satoshis) + * @property {{ [key: string]: VSize }} feeHistogram - Fee histogram: `[[fee_rate, vsize], ...]` sorted by descending fee rate + */ +/** + * Simplified mempool transaction for the `/api/mempool/recent` endpoint. + * + * @typedef {Object} MempoolRecentTx + * @property {Txid} txid - Transaction ID + * @property {Sats} fee - Transaction fee (sats) + * @property {VSize} vsize - Virtual size (vbytes) + * @property {Sats} value - Total output value (sats) + */ +/** + * Merkle inclusion proof for a transaction + * + * @typedef {Object} MerkleProof + * @property {Height} blockHeight - Block height containing the transaction + * @property {string[]} merkle - Merkle proof path (hex-encoded hashes) + * @property {number} pos - Transaction position in the block (0-indexed) + */ +/** @typedef {number} Minute10 */ +/** @typedef {number} Minute30 */ +/** @typedef {number} Month1 */ +/** @typedef {number} Month3 */ +/** @typedef {number} Month6 */ +/** + * Content hash of the projected next block (block 0 of the mempool + * snapshot). Same value as the mempool ETag. Opaque token: pass back + * as `since` on `/api/v1/mempool/block-template/diff/{hash}` to fetch + * deltas. + * + * @typedef {number} NextBlockHash + */ +/** + * `since` hash for `/api/v1/mempool/block-template/diff/{hash}`. + * + * @typedef {Object} NextBlockHashParam + * @property {NextBlockHash} hash + */ +/** + * OHLC (Open, High, Low, Close) data in cents + * + * @typedef {Object} OHLCCents + * @property {Open} open + * @property {High} high + * @property {Low} low + * @property {Close} close + */ +/** + * OHLC (Open, High, Low, Close) data in dollars + * + * @typedef {Object} OHLCDollars + * @property {Open} open + * @property {High} high + * @property {Low} low + * @property {Close} close + */ +/** + * OHLC (Open, High, Low, Close) data in satoshis + * + * @typedef {Object} OHLCSats + * @property {Open} open + * @property {High} high + * @property {Low} low + * @property {Close} close + */ +/** @typedef {TypeIndex} OpReturnIndex */ +/** + * Opening price value for a time period + * + * @typedef {Dollars} Open + */ +/** + * Optional UNIX timestamp query parameter + * + * @typedef {Object} OptionalTimestampParam + * @property {(Timestamp|null)=} timestamp + */ +/** @typedef {number} OutPoint */ +/** + * Type (P2PKH, P2WPKH, P2SH, P2TR, etc.) + * + * @typedef {("p2pk"|"p2pk"|"p2pkh"|"multisig"|"p2sh"|"op_return"|"v0_p2wpkh"|"v0_p2wsh"|"v1_p2tr"|"p2a"|"empty"|"unknown")} OutputType + */ +/** @typedef {TypeIndex} P2AAddrIndex */ +/** @typedef {U8x2} P2ABytes */ +/** @typedef {TypeIndex} P2MSOutputIndex */ +/** @typedef {TypeIndex} P2PK33AddrIndex */ +/** @typedef {U8x33} P2PK33Bytes */ +/** @typedef {TypeIndex} P2PK65AddrIndex */ +/** @typedef {U8x65} P2PK65Bytes */ +/** @typedef {TypeIndex} P2PKHAddrIndex */ +/** @typedef {U8x20} P2PKHBytes */ +/** @typedef {TypeIndex} P2SHAddrIndex */ +/** @typedef {U8x20} P2SHBytes */ +/** @typedef {TypeIndex} P2TRAddrIndex */ +/** @typedef {U8x32} P2TRBytes */ +/** @typedef {TypeIndex} P2WPKHAddrIndex */ +/** @typedef {U8x20} P2WPKHBytes */ +/** @typedef {TypeIndex} P2WSHAddrIndex */ +/** @typedef {U8x32} P2WSHBytes */ +/** + * A paginated list of available series names (1000 per page) + * + * @typedef {Object} PaginatedSeries + * @property {number} currentPage - Current page number (0-indexed) + * @property {number} maxPage - Maximum valid page index (0-indexed) + * @property {number} totalCount - Total number of series + * @property {number} perPage - Results per page + * @property {boolean} hasMore - Whether more pages are available after the current one + * @property {string[]} series - List of series names + */ +/** + * Pagination parameters for paginated API endpoints + * + * @typedef {Object} Pagination + * @property {?number=} page - Pagination index + * @property {?number=} perPage - Results per page (default: 1000, max: 1000) + */ +/** + * Block counts for different time periods + * + * @typedef {Object} PoolBlockCounts + * @property {number} all - Total blocks mined (all time) + * @property {number} _24h - Blocks mined in last 24 hours + * @property {number} _1w - Blocks mined in last week + */ +/** + * Pool's share of total blocks for different time periods + * + * @typedef {Object} PoolBlockShares + * @property {number} all - Share of all blocks (0.0 - 1.0) + * @property {number} _24h - Share of blocks in last 24 hours (0.0 - 1.0) + * @property {number} _1w - Share of blocks in last week (0.0 - 1.0) + */ +/** + * Detailed pool information with statistics across time periods + * + * @typedef {Object} PoolDetail + * @property {PoolDetailInfo} pool - Pool information + * @property {PoolBlockCounts} blockCount - Block counts for different time periods + * @property {PoolBlockShares} blockShare - Pool's share of total blocks for different time periods + * @property {number} estimatedHashrate - Estimated hashrate based on blocks mined (H/s) + * @property {?number=} reportedHashrate - Self-reported hashrate (if available, H/s) + * @property {(Sats|null)=} totalReward - Total reward earned by this pool (sats, all time; None for minor pools) + */ +/** + * Pool information for detail view + * + * @typedef {Object} PoolDetailInfo + * @property {number} id - Pool identifier + * @property {string} name - Pool name + * @property {string} link - Pool website URL + * @property {string[]} addresses - Known payout addresses + * @property {string[]} regexes - Coinbase tag patterns (regexes) + * @property {PoolSlug} slug - URL-friendly pool identifier + * @property {number} uniqueId - Unique pool identifier + */ +/** + * A single pool hashrate data point. + * + * @typedef {Object} PoolHashrateEntry + * @property {Timestamp} timestamp - Unix timestamp + * @property {number} avgHashrate - Average hashrate (H/s) + * @property {number} share - Pool's share of total network hashrate (0.0 - 1.0) + * @property {string} poolName - Pool name + */ +/** + * Basic pool information for listing all pools + * + * @typedef {Object} PoolInfo + * @property {string} name - Pool name + * @property {PoolSlug} slug - URL-friendly pool identifier + * @property {number} uniqueId - Unique numeric pool identifier + */ +/** + * URL-friendly mining pool identifier + * + * @typedef {("unknown"|"blockfills"|"ultimuspool"|"terrapool"|"luxor"|"1thash"|"btccom"|"bitfarms"|"huobipool"|"wayicn"|"canoepool"|"btctop"|"bitcoincom"|"175btc"|"gbminers"|"axbt"|"asicminer"|"bitminter"|"bitcoinrussia"|"btcserv"|"simplecoinus"|"btcguild"|"eligius"|"ozcoin"|"eclipsemc"|"maxbtc"|"triplemining"|"coinlab"|"50btc"|"ghashio"|"stminingcorp"|"bitparking"|"mmpool"|"polmine"|"kncminer"|"bitalo"|"f2pool"|"hhtt"|"megabigpower"|"mtred"|"nmcbit"|"yourbtcnet"|"givemecoins"|"braiinspool"|"antpool"|"multicoinco"|"bcpoolio"|"cointerra"|"kanopool"|"solock"|"ckpool"|"nicehash"|"bitclub"|"bitcoinaffiliatenetwork"|"btcc"|"bwpool"|"exxbw"|"bitsolo"|"bitfury"|"21inc"|"digitalbtc"|"8baochi"|"mybtccoinpool"|"tbdice"|"hashpool"|"nexious"|"bravomining"|"hotpool"|"okexpool"|"bcmonster"|"1hash"|"bixin"|"tatmaspool"|"viabtc"|"connectbtc"|"batpool"|"waterhole"|"dcexploration"|"dcex"|"btpool"|"58coin"|"bitcoinindia"|"shawnp0wers"|"phashio"|"rigpool"|"haozhuzhu"|"7pool"|"miningkings"|"hashbx"|"dpool"|"rawpool"|"haominer"|"helix"|"bitcoinukraine"|"poolin"|"secretsuperstar"|"tigerpoolnet"|"sigmapoolcom"|"okpooltop"|"hummerpool"|"tangpool"|"bytepool"|"spiderpool"|"novablock"|"miningcity"|"binancepool"|"minerium"|"lubiancom"|"okkong"|"aaopool"|"emcdpool"|"foundryusa"|"sbicrypto"|"arkpool"|"purebtccom"|"marapool"|"kucoinpool"|"entrustcharitypool"|"okminer"|"titan"|"pegapool"|"btcnuggets"|"cloudhashing"|"digitalxmintsy"|"telco214"|"btcpoolparty"|"multipool"|"transactioncoinmining"|"btcdig"|"trickysbtcpool"|"btcmp"|"eobot"|"unomp"|"patels"|"gogreenlight"|"bitcoinindiapool"|"ekanembtc"|"canoe"|"tiger"|"1m1x"|"zulupool"|"secpool"|"ocean"|"whitepool"|"wiz"|"wk057"|"futurebitapollosolo"|"carbonnegative"|"portlandhodl"|"phoenix"|"neopool"|"maxipool"|"bitfufupool"|"gdpool"|"miningdutch"|"publicpool"|"miningsquared"|"innopolistech"|"btclab"|"parasite"|"redrockpool"|"est3lar"|"braiinssolo"|"solopoolcom"|"noderunners")} PoolSlug + */ +/** + * Mining pool slug + block height path parameters + * + * @typedef {Object} PoolSlugAndHeightParam + * @property {PoolSlug} slug + * @property {Height} height + */ +/** + * Mining pool slug path parameter + * + * @typedef {Object} PoolSlugParam + * @property {PoolSlug} slug + */ +/** + * Mining pool with block statistics for a time period + * + * @typedef {Object} PoolStats + * @property {number} poolId - Unique pool identifier + * @property {string} name - Pool name + * @property {string} link - Pool website URL + * @property {number} blockCount - Number of blocks mined in the time period + * @property {number} rank - Pool ranking by block count (1 = most blocks) + * @property {number} emptyBlocks - Number of empty blocks mined + * @property {PoolSlug} slug - URL-friendly pool identifier + * @property {number} share - Pool's share of total blocks (0.0 - 1.0) + * @property {number} poolUniqueId - Unique pool identifier + */ +/** + * Mining pools response for a time period + * + * @typedef {Object} PoolsSummary + * @property {PoolStats[]} pools - List of pools sorted by block count descending + * @property {number} blockCount - Total blocks in the time period + * @property {number} lastEstimatedHashrate - Estimated network hashrate (H/s) + * @property {number} lastEstimatedHashrate3d - Estimated network hashrate over last 3 days (H/s) + * @property {number} lastEstimatedHashrate1w - Estimated network hashrate over last 1 week (H/s) + */ +/** + * Current price response matching mempool.space /api/v1/prices format + * + * @typedef {Object} Prices + * @property {Timestamp} time - Unix timestamp + * @property {Dollars} uSD - BTC/USD price + */ +/** + * A range boundary: integer index, date, or timestamp. + * + * @typedef {(number|Date|Timestamp)} RangeIndex + */ +/** + * Transaction locktime. Values below 500,000,000 are interpreted as block heights; values at or above are Unix timestamps. + * + * @typedef {number} RawLockTime + */ +/** + * Response body for `GET /api/v1/tx/:txid/rbf`. Both fields are null + * when the tx has no known RBF history within the mempool monitor's + * graveyard retention window. + * + * @typedef {Object} RbfResponse + * @property {(ReplacementNode|null)=} replacements + * @property {?Txid[]=} replaces + */ +/** + * Transaction summary carried inside an RBF replacement node. Shape + * matches mempool.space's `/api/v1/tx/:txid/rbf` and + * `/api/v1/replacements` responses. + * + * @typedef {Object} RbfTx + * @property {Txid} txid + * @property {Sats} fee + * @property {VSize} vsize + * @property {Sats} value - Sum of output amounts. + * @property {FeeRate} rate + * @property {Timestamp} time + * @property {boolean} rbf - BIP-125 signaling: at least one input has sequence < 0xffffffff-1. + * @property {?boolean=} fullRbf - Only populated on the root `tx` of an RBF response. `true` iff +this tx displaced at least one non-signaling predecessor. + */ +/** + * Recommended fee rates in sat/vB + * + * @typedef {Object} RecommendedFees + * @property {FeeRate} fastestFee - Fee rate for fastest confirmation (next block) + * @property {FeeRate} halfHourFee - Fee rate for confirmation within ~30 minutes (3 blocks) + * @property {FeeRate} hourFee - Fee rate for confirmation within ~1 hour (6 blocks) + * @property {FeeRate} economyFee - Fee rate for economical confirmation + * @property {FeeRate} minimumFee - Minimum relay fee rate + */ +/** + * One node in an RBF replacement tree. The node's `tx` replaced each + * entry in `replaces`, recursively. + * + * @typedef {Object} ReplacementNode + * @property {RbfTx} tx + * @property {Timestamp} time - First-seen timestamp, duplicated here to match mempool.space's +on-the-wire shape. + * @property {boolean} fullRbf - Any predecessor in this subtree was non-signaling. + * @property {?number=} interval - Seconds between this node's `time` and the successor that +replaced it. Omitted on the root of an RBF response. + * @property {?boolean=} mined - `Some(true)` iff this node's tx is currently confirmed. Absent +on serialization otherwise. + * @property {ReplacementNode[]} replaces + */ +/** + * Block reward statistics over a range of blocks + * + * @typedef {Object} RewardStats + * @property {Height} startBlock - First block in the range + * @property {Height} endBlock - Last block in the range + * @property {Sats} totalReward - Total coinbase rewards (subsidy + fees) in sats + * @property {Sats} totalFee - Total transaction fees in sats + * @property {number} totalTx - Total number of transactions + */ +/** + * Amount in satoshis (1 BTC = 100,000,000 sats) + * + * @typedef {number} Sats + */ +/** + * Fractional satoshis (f64) - for representing USD prices in sats + * + * Formula: `sats_fract = usd_value * 100_000_000 / btc_price` + * + * When BTC is $100,000: + * - $1 = 1,000 sats + * - $0.001 = 1 sat + * - $0.0001 = 0.1 sats (fractional) + * + * @typedef {number} SatsFract + */ +/** + * Signed satoshis (i64) - for values that can be negative. + * Used for changes, deltas, profit/loss calculations, etc. + * + * @typedef {number} SatsSigned + */ +/** + * @typedef {Object} SearchQuery + * @property {SeriesName} q - Search query string + * @property {Limit=} limit - Maximum number of results + */ +/** + * Series count statistics - distinct series and total series-index combinations + * + * @typedef {Object} SeriesCount + * @property {number} distinctSeries - Number of unique series available (e.g., realized_price, market_cap) + * @property {number} totalEndpoints - Total number of series-index combinations across all timeframes + * @property {number} lazyEndpoints - Number of lazy (computed on-the-fly) series-index combinations + * @property {number} storedEndpoints - Number of eager (stored on disk) series-index combinations + */ +/** + * Metadata about a series + * + * @typedef {Object} SeriesInfo + * @property {Index[]} indexes - Available indexes + * @property {string} type - Value type (e.g. "f32", "u64", "Sats") + */ +/** + * SeriesLeaf with JSON Schema for client generation + * + * @typedef {Object} SeriesLeafWithSchema + * @property {string} name - The series name/identifier + * @property {string} kind - The Rust type (e.g., "Sats", "StoredF64") + * @property {Index[]} indexes - Available indexes for this series + * @property {string} type - JSON Schema type (e.g., "integer", "number", "string", "boolean", "array", "object") + */ +/** + * Comma-separated list of series names + * + * @typedef {string} SeriesList + */ +/** + * Series name + * + * @typedef {string} SeriesName + */ +/** + * @typedef {Object} SeriesNameWithIndex + * @property {SeriesName} series - Series name + * @property {Index} index - Aggregation index + */ +/** + * @typedef {Object} SeriesParam + * @property {SeriesName} series + */ +/** + * Selection of series to query + * + * @typedef {Object} SeriesSelection + * @property {SeriesList} series - Requested series + * @property {Index} index - Index to query + * @property {(RangeIndex|null)=} start - Inclusive start: integer index, date (YYYY-MM-DD), or timestamp (ISO 8601). Negative integers count from end. Aliases: `from`, `f`, `s` + * @property {(RangeIndex|null)=} end - Exclusive end: integer index, date (YYYY-MM-DD), or timestamp (ISO 8601). Negative integers count from end. Aliases: `to`, `t`, `e` + * @property {(Limit|null)=} limit - Maximum number of values to return (ignored if `end` is set). Aliases: `count`, `c`, `l` + * @property {Format=} format - Format of the output + */ +/** + * Legacy series selection parameters (deprecated) + * + * @typedef {Object} SeriesSelectionLegacy + * @property {Index} index + * @property {SeriesList} ids + * @property {(RangeIndex|null)=} start - Inclusive start: integer index, date (YYYY-MM-DD), or timestamp (ISO 8601). Negative integers count from end. Aliases: `from`, `f`, `s` + * @property {(RangeIndex|null)=} end - Exclusive end: integer index, date (YYYY-MM-DD), or timestamp (ISO 8601). Negative integers count from end. Aliases: `to`, `t`, `e` + * @property {(Limit|null)=} limit - Maximum number of values to return (ignored if `end` is set). Aliases: `count`, `c`, `l` + * @property {Format=} format - Format of the output + */ +/** + * BIP-141 sigop cost. The block-level budget is 80,000, so a `u32` + * fits a single tx's count with room to spare. + * + * Witness sigops count as 1; legacy and P2SH-redeem sigops count as 4. + * Five vbytes per sigop is the policy adjustment Core applies in + * `nSigOpCost` to discourage sigop-heavy txs (`max(weight/4, sigops*5)`). + * + * @typedef {number} SigOps + */ +/** @typedef {boolean} StoredBool */ +/** + * Stored 32-bit floating point value + * + * @typedef {number} StoredF32 + */ +/** + * Fixed-size 64-bit floating point value optimized for on-disk storage + * + * @typedef {number} StoredF64 + */ +/** + * Fixed-size 64-bit signed integer optimized for on-disk storage + * + * @typedef {number} StoredI64 + */ +/** @typedef {number} StoredI8 */ +/** @typedef {number} StoredU16 */ +/** + * Fixed-size 32-bit unsigned integer optimized for on-disk storage + * + * @typedef {number} StoredU32 + */ +/** + * Fixed-size 64-bit unsigned integer optimized for on-disk storage + * + * @typedef {number} StoredU64 + */ +/** + * Current supply state tracking UTXO count and total value + * + * @typedef {Object} SupplyState + * @property {number} utxoCount - Number of unspent transaction outputs + * @property {Sats} value - Total value in satoshis + */ +/** + * Sync status of the indexer + * + * @typedef {Object} SyncStatus + * @property {Height} indexedHeight - Height of the last indexed block + * @property {Height} computedHeight - Height of the last computed block (series) + * @property {Height} tipHeight - Height of the chain tip (from Bitcoin node) + * @property {Height} blocksBehind - Number of blocks behind the tip + * @property {string} lastIndexedAt - Human-readable timestamp of the last indexed block (ISO 8601) + * @property {Timestamp} lastIndexedAtUnix - Unix timestamp of the last indexed block + */ +/** + * Time period for mining statistics. + * + * Used to specify the lookback window for pool statistics, hashrate calculations, + * and other time-based mining series. + * + * @typedef {("24h"|"3d"|"1w"|"1m"|"3m"|"6m"|"1y"|"2y"|"3y"|"all")} TimePeriod + */ +/** + * Time period path parameter (24h, 3d, 1w, 1m, 3m, 6m, 1y, 2y, 3y) + * + * @typedef {Object} TimePeriodParam + * @property {TimePeriod} timePeriod + */ +/** + * UNIX timestamp in seconds + * + * @typedef {number} Timestamp + */ +/** + * UNIX timestamp path parameter + * + * @typedef {Object} TimestampParam + * @property {Timestamp} timestamp + */ +/** + * Transaction information compatible with mempool.space API format + * + * @typedef {Object} Transaction + * @property {(TxIndex|null)=} index - Internal transaction index (brk-specific, not in mempool.space) + * @property {Txid} txid - Transaction ID + * @property {TxVersionRaw} version - Transaction version (raw i32 from Bitcoin protocol, may contain non-standard values in coinbase txs) + * @property {RawLockTime} locktime - Transaction lock time + * @property {TxIn[]} vin - Transaction inputs + * @property {TxOut[]} vout - Transaction outputs + * @property {number} size - Transaction size in bytes + * @property {Weight} weight - Transaction weight + * @property {SigOps} sigops - Number of signature operations + * @property {Sats} fee - Transaction fee in satoshis + * @property {TxStatus} status - Confirmation status (confirmed, block height/hash/time) + */ +/** + * Hierarchical tree node for organizing series into categories + * + * @typedef {({ [key: string]: TreeNode }|SeriesLeafWithSchema)} TreeNode + */ +/** + * Transaction input + * + * @typedef {Object} TxIn + * @property {Txid} txid - Transaction ID of the output being spent + * @property {Vout} vout - Output index being spent (u16: coinbase is 65535, mempool.space uses u32: 4294967295) + * @property {(TxOut|null)=} prevout - Information about the previous output being spent + * @property {string} scriptsig - Signature script (hex, for non-SegWit inputs) + * @property {string} scriptsigAsm - Signature script in assembly format + * @property {Witness} witness - Witness data (stack items, present for SegWit inputs; hex-encoded on the wire) + * @property {boolean} isCoinbase - Whether this input is a coinbase (block reward) input + * @property {number} sequence - Input sequence number + * @property {string} innerRedeemscriptAsm - Inner redeemscript in assembly (for P2SH-wrapped SegWit: scriptsig + witness both present) + * @property {string} innerWitnessscriptAsm - Inner witnessscript in assembly (for P2WSH: last witness item decoded as script) + */ +/** @typedef {number} TxInIndex */ +/** + * Chain-wide transaction index (0 = the genesis coinbase). For an + * in-block position, use `BlockTxIndex` instead. + * + * @typedef {number} TxIndex + */ +/** + * Transaction index path parameter + * + * @typedef {Object} TxIndexParam + * @property {TxIndex} index + */ +/** + * Transaction output + * + * @typedef {Object} TxOut + * @property {string} scriptpubkey - Script pubkey (locking script) + * @property {Sats} value - Value of the output in satoshis + */ +/** @typedef {number} TxOutIndex */ +/** + * Status of an output indicating whether it has been spent + * + * @typedef {Object} TxOutspend + * @property {boolean} spent - Whether the output has been spent + * @property {(Txid|null)=} txid - Transaction ID of the spending transaction (only present if spent) + * @property {(Vin|null)=} vin - Input index in the spending transaction (only present if spent) + * @property {(TxStatus|null)=} status - Status of the spending transaction (only present if spent) + */ +/** + * Transaction confirmation status + * + * @typedef {Object} TxStatus + * @property {boolean} confirmed - Whether the transaction is confirmed + * @property {(Height|null)=} blockHeight - Block height (only present if confirmed) + * @property {(BlockHash|null)=} blockHash - Block hash (only present if confirmed) + * @property {(Timestamp|null)=} blockTime - Block timestamp (only present if confirmed) + */ +/** + * Transaction version number + * + * @typedef {number} TxVersion + */ +/** + * Raw transaction version (i32) from Bitcoin protocol. + * Unlike TxVersion (u8, indexed), this preserves non-standard values + * used in coinbase txs for miner signaling/branding. + * + * @typedef {number} TxVersionRaw + */ +/** + * Transaction ID (hash) + * + * @typedef {string} Txid + */ +/** + * Transaction ID path parameter + * + * @typedef {Object} TxidParam + * @property {Txid} txid + */ +/** + * Transaction output reference (txid + output index) + * + * @typedef {Object} TxidVout + * @property {Txid} txid - Transaction ID + * @property {Vout} vout - Output index + */ +/** + * Query parameter for transaction-times endpoint. + * + * Extracted manually because `serde_urlencoded` (and serde derive in general) + * doesn't support repeated keys like `txId[]=a&txId[]=b`. The schema is still + * declared via `JsonSchema` so the OpenAPI spec lists the parameter and the + * generated client SDKs see `txids: List[Txid]`. + * + * @typedef {Object} TxidsParam + * @property {Txid[]} txId - Transaction IDs to look up (max 250 per request). + */ +/** + * Index within its type (e.g., 0 for first P2WPKH address) + * + * @typedef {number} TypeIndex + */ +/** @typedef {number[]} U8x2 */ +/** @typedef {number[]} U8x20 */ +/** @typedef {number[]} U8x32 */ +/** @typedef {number[]} U8x33 */ +/** @typedef {number[]} U8x65 */ +/** @typedef {TypeIndex} UnknownOutputIndex */ +/** + * UTXO Realized Price Distribution for a cohort on a specific date. + * + * Supply is grouped by the close price at which each UTXO was last moved. + * Each bucket exposes three values: supply in BTC, realized cap contribution + * in USD (sum of `realized_price * supply` over the coins in the bucket), and + * unrealized P&L in USD (`close * supply - realized_cap`, can be negative). + * + * @typedef {Object} Urpd + * @property {Cohort} cohort + * @property {Date} date + * @property {UrpdAggregation} aggregation - Aggregation strategy applied to the buckets. + * @property {Dollars} close - Close price on `date`, in USD. Anchor for `unrealized_pnl`. + * @property {Bitcoin} totalSupply - Sum of `supply` across all buckets, in BTC. + * @property {UrpdBucket[]} buckets + */ +/** + * Aggregation strategy for URPD buckets. + * Options: raw (no aggregation), lin200/lin500/lin1000 (linear $200/$500/$1000), + * log10/log50/log100/log200/log500/log1000/log2000 (logarithmic with 10/50/100/200/500/1000/2000 buckets per decade). + * + * @typedef {("raw"|"lin200"|"lin500"|"lin1000"|"log10"|"log50"|"log100"|"log200"|"log500"|"log1000"|"log2000")} UrpdAggregation + */ +/** + * A single bucket in a URPD snapshot. + * + * @typedef {Object} UrpdBucket + * @property {Dollars} priceFloor - Lower bound of the bucket, in USD. Equals the exact realized price for `Raw`. + * @property {Bitcoin} supply - Supply held with a last-move price inside this bucket, in BTC. + * @property {Dollars} realizedCap - Realized cap contribution in USD: sum of `realized_price * supply` over the coins in this bucket. + * @property {Dollars} unrealizedPnl - Unrealized P&L in USD against the close on the snapshot date: `close * supply - realized_cap`. Can be negative. + */ +/** + * Path parameters for per-cohort URPD endpoints. + * + * @typedef {Object} UrpdCohortParam + * @property {Cohort} cohort + */ +/** + * Path parameters for `/api/urpd/{cohort}/{date}`. + * + * @typedef {Object} UrpdParams + * @property {Cohort} cohort + * @property {string} date + */ +/** + * Query parameters for URPD endpoints. + * + * @typedef {Object} UrpdQuery + * @property {UrpdAggregation=} agg - Aggregation strategy. Default: raw (no aggregation). Accepts `bucket` as alias. + */ +/** + * Unspent transaction output + * + * @typedef {Object} Utxo + * @property {Txid} txid - Transaction ID of the UTXO + * @property {Vout} vout - Output index + * @property {TxStatus} status - Confirmation status + * @property {Sats} value - Output value in satoshis + */ +/** + * Virtual size in vbytes (weight / 4, rounded up). Max block vsize is ~1,000,000 vB. + * + * @typedef {number} VSize + */ +/** + * @typedef {Object} ValidateAddrParam + * @property {string} address - Bitcoin address to validate (can be any string) + */ +/** + * Version tracking for data schema and computed values. + * + * Used to detect when stored data needs to be recomputed due to changes + * in computation logic or source data versions. Supports validation + * against persisted versions to ensure compatibility. + * + * @typedef {number} Version + */ +/** + * Input index in the spending transaction + * + * @typedef {number} Vin + */ +/** + * Index of the output being spent in the previous transaction + * + * @typedef {number} Vout + */ +/** @typedef {number} Week1 */ +/** + * Weight in weight units (WU). Max block weight is 4,000,000 WU. + * + * @typedef {number} Weight + */ +/** + * Transaction witness: a stack of byte arrays, one per witness item. + * + * Wraps `bitcoin::Witness` (single-buffer layout with offsets, much + * more compact than `Vec>`). Serializes as a JSON array of + * hex strings - the format used by Bitcoin Core REST and mempool.space + * and matching brk's `script_sig: ScriptBuf` (bytes internally, hex + * on the wire). + * + * @typedef {string[]} Witness + */ +/** @typedef {number} Year1 */ +/** @typedef {number} Year10 */ + +/** + * @typedef {Object} BrkClientOptions + * @property {string} baseUrl - Base URL for the API + * @property {number} [timeout] - Request timeout in milliseconds + * @property {string|boolean} [browserCache] - Enable browser Cache API with default name (true), custom name (string), or disable (false). No effect in Node.js. Default: true + * @property {number|boolean} [memCache] - In-memory parsed-response cache size (LRU). true/undefined → 1000, false/0 → disabled. Lets 304 responses skip the JSON parse entirely. Default: 1000 + */ + +const _isBrowser = typeof window !== 'undefined' && 'caches' in window; +const _runIdle = (/** @type {VoidFunction} */ fn) => (globalThis.requestIdleCallback ?? setTimeout)(fn); +const _defaultBrowserCacheName = '__BRK_CLIENT__'; +const _DEFAULT_MEM_CACHE_SIZE = 1000; + +/** @template T @typedef {{ etag: string | null, value: T }} _MemEntry */ +/** @param {*} v */ +const _addCamelGetters = (v) => { + if (Array.isArray(v)) { v.forEach(_addCamelGetters); return v; } + if (v && typeof v === 'object' && v.constructor === Object) { + for (const k in v) { + if (k.includes('_')) { + const c = k.replace(/_([a-z])/g, (_, l) => l.toUpperCase()); + if (!(c in v)) Object.defineProperty(v, c, { get() { return this[k]; } }); + } + _addCamelGetters(v[k]); + } + } + return v; +}; + +/** + * @param {string|boolean|undefined} option + * @returns {Promise} + */ +const _openBrowserCache = (option) => { + if (!_isBrowser || option === false) return Promise.resolve(null); + const name = typeof option === 'string' ? option : _defaultBrowserCacheName; + return caches.open(name).catch(() => null); +}; + +/** + * Custom error class for BRK client errors + */ +class BrkError extends Error { + /** + * @param {string} message + * @param {number} [status] + */ + constructor(message, status) { + super(message); + this.name = 'BrkError'; + this.status = status; + } +} + +// Date conversion constants and helpers +const _GENESIS = new Date(2009, 0, 3); // day1 0, week1 0 +const _DAY_ONE = new Date(2009, 0, 9); // day1 1 (6 day gap after genesis) +const _MS_PER_DAY = 86400000; +const _MS_PER_WEEK = 7 * _MS_PER_DAY; +const _EPOCH_MS = 1230768000000; +const _DATE_INDEXES = new Set([ + 'minute10', 'minute30', + 'hour1', 'hour4', 'hour12', + 'day1', 'day3', 'week1', + 'month1', 'month3', 'month6', + 'year1', 'year10', +]); + +/** @param {number} months @returns {globalThis.Date} */ +const _addMonths = (months) => new Date(2009, months, 1); + +/** + * Convert an index value to a Date for date-based indexes. + * @param {Index} index - The index type + * @param {number} i - The index value + * @returns {globalThis.Date} + */ +function indexToDate(index, i) { + switch (index) { + case 'minute10': return new Date(_EPOCH_MS + i * 600000); + case 'minute30': return new Date(_EPOCH_MS + i * 1800000); + case 'hour1': return new Date(_EPOCH_MS + i * 3600000); + case 'hour4': return new Date(_EPOCH_MS + i * 14400000); + case 'hour12': return new Date(_EPOCH_MS + i * 43200000); + case 'day1': return i === 0 ? _GENESIS : new Date(_DAY_ONE.getTime() + (i - 1) * _MS_PER_DAY); + case 'day3': return new Date(_EPOCH_MS - 86400000 + i * 259200000); + case 'week1': return new Date(_GENESIS.getTime() + i * _MS_PER_WEEK); + case 'month1': return _addMonths(i); + case 'month3': return _addMonths(i * 3); + case 'month6': return _addMonths(i * 6); + case 'year1': return new Date(2009 + i, 0, 1); + case 'year10': return new Date(2009 + i * 10, 0, 1); + default: throw new Error(`${index} is not a date-based index`); + } +} + +/** + * Convert a Date to an index value for date-based indexes. + * Returns the floor index (latest index whose date is <= the given date). + * @param {Index} index - The index type + * @param {globalThis.Date} d - The date to convert + * @returns {number} + */ +function dateToIndex(index, d) { + const ms = d.getTime(); + switch (index) { + case 'minute10': return Math.floor((ms - _EPOCH_MS) / 600000); + case 'minute30': return Math.floor((ms - _EPOCH_MS) / 1800000); + case 'hour1': return Math.floor((ms - _EPOCH_MS) / 3600000); + case 'hour4': return Math.floor((ms - _EPOCH_MS) / 14400000); + case 'hour12': return Math.floor((ms - _EPOCH_MS) / 43200000); + case 'day1': { + if (ms < _DAY_ONE.getTime()) return 0; + return 1 + Math.floor((ms - _DAY_ONE.getTime()) / _MS_PER_DAY); + } + case 'day3': return Math.floor((ms - _EPOCH_MS + 86400000) / 259200000); + case 'week1': return Math.floor((ms - _GENESIS.getTime()) / _MS_PER_WEEK); + case 'month1': return (d.getFullYear() - 2009) * 12 + d.getMonth(); + case 'month3': return (d.getFullYear() - 2009) * 4 + Math.floor(d.getMonth() / 3); + case 'month6': return (d.getFullYear() - 2009) * 2 + Math.floor(d.getMonth() / 6); + case 'year1': return d.getFullYear() - 2009; + case 'year10': return Math.floor((d.getFullYear() - 2009) / 10); + default: throw new Error(`${index} is not a date-based index`); + } +} + +/** + * Wrap raw series data with helper methods. + * @template T + * @param {SeriesData} raw - Raw JSON response + * @returns {DateSeriesData} + */ +function _wrapSeriesData(raw) { + const { index, start, end, data } = raw; + const _dateBased = _DATE_INDEXES.has(index); + return /** @type {DateSeriesData} */ ({ + ...raw, + isDateBased: _dateBased, + indexes() { + /** @type {number[]} */ + const result = []; + for (let i = start; i < end; i++) result.push(i); + return result; + }, + keys() { + return this.indexes(); + }, + entries() { + /** @type {Array<[number, T]>} */ + const result = []; + for (let i = 0; i < data.length; i++) result.push([start + i, data[i]]); + return result; + }, + toMap() { + /** @type {Map} */ + const map = new Map(); + for (let i = 0; i < data.length; i++) map.set(start + i, data[i]); + return map; + }, + *[Symbol.iterator]() { + for (let i = 0; i < data.length; i++) yield /** @type {[number, T]} */ ([start + i, data[i]]); + }, + // DateSeriesData methods (only meaningful for date-based indexes) + dates() { + /** @type {globalThis.Date[]} */ + const result = []; + for (let i = start; i < end; i++) result.push(indexToDate(index, i)); + return result; + }, + dateEntries() { + /** @type {Array<[globalThis.Date, T]>} */ + const result = []; + for (let i = 0; i < data.length; i++) result.push([indexToDate(index, start + i), data[i]]); + return result; + }, + toDateMap() { + /** @type {Map} */ + const map = new Map(); + for (let i = 0; i < data.length; i++) map.set(indexToDate(index, start + i), data[i]); + return map; + }, + }); +} + +/** + * @template T + * @typedef {Object} SeriesDataBase + * @property {number} version - Version of the series data + * @property {Index} index - The index type used for this query + * @property {string} type - Value type (e.g. "f32", "u64", "Sats") + * @property {number} start - Start index (inclusive) + * @property {number} end - End index (exclusive) + * @property {string} stamp - ISO 8601 timestamp of when the response was generated + * @property {T[]} data - The series data + * @property {boolean} isDateBased - Whether this series uses a date-based index + * @property {() => number[]} indexes - Get index numbers + * @property {() => number[]} keys - Get keys as index numbers (alias for indexes) + * @property {() => Array<[number, T]>} entries - Get [index, value] pairs + * @property {() => Map} toMap - Convert to Map + */ + +/** @template T @typedef {SeriesDataBase & Iterable<[number, T]>} SeriesData */ + +/** + * @template T + * @typedef {Object} DateSeriesDataExtras + * @property {() => globalThis.Date[]} dates - Get dates for each data point + * @property {() => Array<[globalThis.Date, T]>} dateEntries - Get [date, value] pairs + * @property {() => Map} toDateMap - Convert to Map + */ + +/** @template T @typedef {SeriesData & DateSeriesDataExtras} DateSeriesData */ +/** @typedef {SeriesData} AnySeriesData */ + +/** @template T @typedef {(onfulfilled?: (value: SeriesData) => any, onrejected?: (reason: Error) => never) => Promise>} Thenable */ +/** @template T @typedef {(onfulfilled?: (value: DateSeriesData) => any, onrejected?: (reason: Error) => never) => Promise>} DateThenable */ + +/** + * @template T + * @typedef {Object} SeriesEndpoint + * @property {(index: number) => SingleItemBuilder} get - Get single item at index + * @property {(start?: number, end?: number) => RangeBuilder} slice - Slice by index + * @property {(n: number) => RangeBuilder} first - Get first n items + * @property {(n: number) => RangeBuilder} last - Get last n items + * @property {(n: number) => SkippedBuilder} skip - Skip first n items, chain with take() + * @property {(onValue?: (value: SeriesData) => void) => Promise>} fetch - Fetch all data + * @property {() => Promise} fetchCsv - Fetch all data as CSV + * @property {() => Promise} len - Get total number of data points + * @property {() => Promise} version - Get the current version of the series + * @property {Thenable} then - Thenable (await endpoint) + * @property {string} path - The endpoint path + */ + +/** + * @template T + * @typedef {Object} DateSeriesEndpoint + * @property {(index: number | globalThis.Date) => DateSingleItemBuilder} get - Get single item at index or Date + * @property {(start?: number | globalThis.Date, end?: number | globalThis.Date) => DateRangeBuilder} slice - Slice by index or Date + * @property {(n: number) => DateRangeBuilder} first - Get first n items + * @property {(n: number) => DateRangeBuilder} last - Get last n items + * @property {(n: number) => DateSkippedBuilder} skip - Skip first n items, chain with take() + * @property {(onValue?: (value: DateSeriesData) => void) => Promise>} fetch - Fetch all data + * @property {() => Promise} fetchCsv - Fetch all data as CSV + * @property {() => Promise} len - Get total number of data points + * @property {() => Promise} version - Get the current version of the series + * @property {DateThenable} then - Thenable (await endpoint) + * @property {string} path - The endpoint path + */ + +/** @typedef {SeriesEndpoint} AnySeriesEndpoint */ + +/** @template T @typedef {Object} SingleItemBuilder + * @property {(onValue?: (value: SeriesData) => void) => Promise>} fetch - Fetch the item + * @property {() => Promise} fetchCsv - Fetch as CSV + * @property {Thenable} then - Thenable + */ + +/** @template T @typedef {Object} DateSingleItemBuilder + * @property {(onValue?: (value: DateSeriesData) => void) => Promise>} fetch - Fetch the item + * @property {() => Promise} fetchCsv - Fetch as CSV + * @property {DateThenable} then - Thenable + */ + +/** @template T @typedef {Object} SkippedBuilder + * @property {(n: number) => RangeBuilder} take - Take n items after skipped position + * @property {(onValue?: (value: SeriesData) => void) => Promise>} fetch - Fetch from skipped position to end + * @property {() => Promise} fetchCsv - Fetch as CSV + * @property {Thenable} then - Thenable + */ + +/** @template T @typedef {Object} DateSkippedBuilder + * @property {(n: number) => DateRangeBuilder} take - Take n items after skipped position + * @property {(onValue?: (value: DateSeriesData) => void) => Promise>} fetch - Fetch from skipped position to end + * @property {() => Promise} fetchCsv - Fetch as CSV + * @property {DateThenable} then - Thenable + */ + +/** @template T @typedef {Object} RangeBuilder + * @property {(onValue?: (value: SeriesData) => void) => Promise>} fetch - Fetch the range + * @property {() => Promise} fetchCsv - Fetch as CSV + * @property {Thenable} then - Thenable + */ + +/** @template T @typedef {Object} DateRangeBuilder + * @property {(onValue?: (value: DateSeriesData) => void) => Promise>} fetch - Fetch the range + * @property {() => Promise} fetchCsv - Fetch as CSV + * @property {DateThenable} then - Thenable + */ + +/** + * @template T + * @typedef {Object} SeriesPattern + * @property {string} name - The series name + * @property {Readonly>>>} by - Index endpoints as lazy getters + * @property {() => readonly Index[]} indexes - Get the list of available indexes + * @property {(index: Index) => SeriesEndpoint|undefined} get - Get an endpoint for a specific index + */ + +/** @typedef {SeriesPattern} AnySeriesPattern */ + +/** + * Create a series endpoint builder with typestate pattern. + * @template T + * @param {BrkClient} client + * @param {string} name - The series vec name + * @param {Index} index - The index name + * @returns {DateSeriesEndpoint} + */ +function _endpoint(client, name, index) { + const p = `/api/series/${name}/${index}`; + + /** + * @param {number} [start] + * @param {number} [end] + * @param {string} [format] + * @returns {string} + */ + const buildPath = (start, end, format) => { + const params = new URLSearchParams(); + if (start !== undefined) params.set('start', String(start)); + if (end !== undefined) params.set('end', String(end)); + if (format) params.set('format', format); + const query = params.toString(); + return query ? `${p}?${query}` : p; + }; + + /** + * @param {number} [start] + * @param {number} [end] + * @returns {DateRangeBuilder} + */ + const rangeBuilder = (start, end) => ({ + fetch(onValue) { return client._fetchSeriesData(buildPath(start, end), onValue); }, + fetchCsv() { return client.getText(buildPath(start, end, 'csv')); }, + then(resolve, reject) { return this.fetch().then(resolve, reject); }, + }); + + /** + * @param {number} idx + * @returns {DateSingleItemBuilder} + */ + const singleItemBuilder = (idx) => ({ + fetch(onValue) { return client._fetchSeriesData(buildPath(idx, idx + 1), onValue); }, + fetchCsv() { return client.getText(buildPath(idx, idx + 1, 'csv')); }, + then(resolve, reject) { return this.fetch().then(resolve, reject); }, + }); + + /** + * @param {number} start + * @returns {DateSkippedBuilder} + */ + const skippedBuilder = (start) => ({ + take(n) { return rangeBuilder(start, start + n); }, + fetch(onValue) { return client._fetchSeriesData(buildPath(start, undefined), onValue); }, + fetchCsv() { return client.getText(buildPath(start, undefined, 'csv')); }, + then(resolve, reject) { return this.fetch().then(resolve, reject); }, + }); + + /** @type {DateSeriesEndpoint} */ + const endpoint = { + get(idx) { if (idx instanceof Date) idx = dateToIndex(index, idx); return singleItemBuilder(idx); }, + slice(start, end) { + if (start instanceof Date) start = dateToIndex(index, start); + if (end instanceof Date) end = dateToIndex(index, end); + return rangeBuilder(start, end); + }, + first(n) { return rangeBuilder(undefined, n); }, + last(n) { return n === 0 ? rangeBuilder(undefined, 0) : rangeBuilder(-n, undefined); }, + skip(n) { return skippedBuilder(n); }, + fetch(onValue) { return client._fetchSeriesData(buildPath(), onValue); }, + fetchCsv() { return client.getText(buildPath(undefined, undefined, 'csv')); }, + len() { return client.getSeriesLen(name, index); }, + version() { return client.getSeriesVersion(name, index); }, + then(resolve, reject) { return this.fetch().then(resolve, reject); }, + get path() { return p; }, + }; + + return endpoint; +} + +/** + * Base HTTP client for making requests with caching support + */ +class BrkClientBase { + /** + * @param {BrkClientOptions|string} options + */ + constructor(options) { + const isString = typeof options === 'string'; + const rawUrl = isString ? options : options.baseUrl; + this.baseUrl = rawUrl.endsWith('/') ? rawUrl.slice(0, -1) : rawUrl; + this.timeout = isString ? 5000 : (options.timeout ?? 5000); + /** @type {Promise} */ + this._browserCachePromise = _openBrowserCache(isString ? undefined : options.browserCache); + /** @type {Cache | null} */ + this._browserCache = null; + this._browserCachePromise.then(c => this._browserCache = c); + const memOpt = isString ? undefined : options.memCache; + this._memCacheMax = memOpt === false || memOpt === 0 + ? 0 + : (typeof memOpt === 'number' ? memOpt : _DEFAULT_MEM_CACHE_SIZE); + /** @type {Map>} */ + this._memCache = new Map(); + } + + /** + * @template T + * @param {string} key + * @returns {_MemEntry | undefined} + */ + _memGet(key) { + if (!this._memCacheMax) return undefined; + const hit = this._memCache.get(key); + if (!hit) return undefined; + this._memCache.delete(key); + this._memCache.set(key, hit); + return /** @type {_MemEntry} */ (hit); + } + + /** + * @param {string} key + * @param {string | null} etag + * @param {unknown} value + */ + _memSet(key, etag, value) { + if (!this._memCacheMax) return; + if (this._memCache.has(key)) this._memCache.delete(key); + else if (this._memCache.size >= this._memCacheMax) { + const oldest = this._memCache.keys().next().value; + if (oldest !== undefined) this._memCache.delete(oldest); + } + this._memCache.set(key, { etag, value }); + } + + /** + * @param {string} path + * @param {{ signal?: AbortSignal, cache?: boolean }} [options] + * @returns {Promise} + */ + async get(path, { signal, cache = true } = {}) { + const url = `${this.baseUrl}${path}`; + const signals = [AbortSignal.timeout(this.timeout)]; + if (signal) signals.push(signal); + /** @type {RequestInit} */ + const init = { signal: AbortSignal.any(signals) }; + if (!cache) init.cache = 'no-store'; + const res = await fetch(url, init); + if (!res.ok) throw new BrkError(`HTTP ${res.status}: ${url}`, res.status); + return res; + } + + /** + * Make a GET request with layered caching. + * + * Contract: + * - The returned Promise resolves with the **freshest** value (post-revalidation). + * - `onValue` fires once with the freshest value, or twice if a stale snapshot + * could be shown first (stale-while-revalidate). On a 304 there is no second fire. + * + * Layers: + * - L1 (memCache): in-memory parsed values keyed by URL+ETag. Lets 304s skip the parse entirely. + * - L2 (browserCache): Cache API, survives reload and feeds onValue fast on cold start. + * + * @template T + * @param {string} path + * @param {(res: Response) => Promise} parse - Response body reader + * @param {{ onValue?: (value: T) => void, signal?: AbortSignal, cache?: boolean }} [options] + * @returns {Promise} + */ + async _getCached(path, parse, { onValue, signal, cache = true } = {}) { + if (!cache) { + const res = await this.get(path, { signal, cache }); + const value = await parse(res); + if (onValue) onValue(value); + return value; + } + + const url = `${this.baseUrl}${path}`; + /** @type {_MemEntry | undefined} */ + const memHit = this._memGet(url); + const browserCache = this._browserCache; + + // L1 fast path: deliver from memCache, revalidate via network. + // ETag match → zero parse, zero clone, zero cache write, no second onValue fire. + if (memHit) { + if (onValue) onValue(memHit.value); + try { + const res = await this.get(path, { signal }); + const netEtag = res.headers.get('ETag'); + if (netEtag && netEtag === memHit.etag) return memHit.value; + const cloned = browserCache ? res.clone() : null; + const value = await parse(res); + this._memSet(url, netEtag, value); + if (onValue) onValue(value); + if (cloned && browserCache) { + const cacheStore = browserCache; + _runIdle(() => cacheStore.put(url, cloned)); + } + return value; + } catch { + return memHit.value; + } + } + + // L1 miss: race browserCache (stale snapshot) vs network (fresh). + let networkSettled = false; + const stalePromise = onValue && browserCache + ? browserCache.match(url).then(async (res) => { + if (!res || networkSettled) return null; + const value = await parse(res); + if (networkSettled) return value; + this._memSet(url, res.headers.get('ETag'), value); + onValue(value); + return value; + }).catch(() => null) + : null; + + try { + const res = await this.get(path, { signal }); + networkSettled = true; + const netEtag = res.headers.get('ETag'); + // Stale won and populated memCache with matching ETag → reuse, skip parse + second onValue. + const populated = /** @type {_MemEntry | undefined} */ (this._memGet(url)); + if (populated && netEtag && netEtag === populated.etag) return populated.value; + const cloned = browserCache ? res.clone() : null; + const value = await parse(res); + this._memSet(url, netEtag, value); + if (onValue) onValue(value); + if (cloned && browserCache) { + const cacheStore = browserCache; + _runIdle(() => cacheStore.put(url, cloned)); + } + return value; + } catch (e) { + const stale = await stalePromise; + if (stale != null) return stale; + throw e; + } + } + + /** + * Make a GET request expecting a JSON response. Cached and supports `onValue`. + * @template T + * @param {string} path + * @param {{ onValue?: (value: T) => void, signal?: AbortSignal, cache?: boolean }} [options] + * @returns {Promise} + */ + getJson(path, options) { + return this._getCached(path, async (res) => _addCamelGetters(await res.json()), options); + } + + /** + * Make a GET request expecting a text response (text/plain, text/csv, ...). + * Cached and supports `onValue`, same as `getJson`. + * @param {string} path + * @param {{ onValue?: (value: string) => void, signal?: AbortSignal, cache?: boolean }} [options] + * @returns {Promise} + */ + getText(path, options) { + return this._getCached(path, (res) => res.text(), options); + } + + /** + * Make a GET request expecting binary data (application/octet-stream). + * Cached and supports `onValue`, same as `getJson`. + * @param {string} path + * @param {{ onValue?: (value: Uint8Array) => void, signal?: AbortSignal, cache?: boolean }} [options] + * @returns {Promise} + */ + getBytes(path, options) { + return this._getCached(path, async (res) => new Uint8Array(await res.arrayBuffer()), options); + } + + /** + * Make a POST request with a string body. + * + * POST responses are uncached and never invoke `onValue` — every call hits + * the network with the same body and returns the upstream response. + * + * @param {string} path + * @param {string} body + * @param {{ signal?: AbortSignal }} [options] + * @returns {Promise} + */ + async post(path, body, { signal } = {}) { + const url = `${this.baseUrl}${path}`; + const signals = [AbortSignal.timeout(this.timeout)]; + if (signal) signals.push(signal); + const res = await fetch(url, { + method: 'POST', + body, + signal: AbortSignal.any(signals), + }); + if (!res.ok) throw new BrkError(`HTTP ${res.status}: ${url}`, res.status); + return res; + } + + /** + * Make a POST request expecting a JSON response. + * @template T + * @param {string} path + * @param {string} body + * @param {{ signal?: AbortSignal }} [options] + * @returns {Promise} + */ + async postJson(path, body, options) { + const res = await this.post(path, body, options); + return _addCamelGetters(await res.json()); + } + + /** + * Make a POST request expecting a text response. + * @param {string} path + * @param {string} body + * @param {{ signal?: AbortSignal }} [options] + * @returns {Promise} + */ + async postText(path, body, options) { + const res = await this.post(path, body, options); + return res.text(); + } + + /** + * Make a POST request expecting binary data (application/octet-stream). + * @param {string} path + * @param {string} body + * @param {{ signal?: AbortSignal }} [options] + * @returns {Promise} + */ + async postBytes(path, body, options) { + const res = await this.post(path, body, options); + return new Uint8Array(await res.arrayBuffer()); + } + + /** + * Fetch series data and wrap with helper methods (internal) + * @template T + * @param {string} path + * @param {(value: DateSeriesData) => void} [onValue] + * @returns {Promise>} + */ + async _fetchSeriesData(path, onValue) { + const wrappedOnValue = onValue ? (/** @type {SeriesData} */ raw) => onValue(_wrapSeriesData(raw)) : undefined; + const raw = await this.getJson(path, { onValue: wrappedOnValue }); + return _wrapSeriesData(raw); + } +} + +/** + * Build series name with suffix. + * @param {string} acc - Accumulated prefix + * @param {string} s - Series suffix + * @returns {string} + */ +const _m = (acc, s) => s ? (acc ? `${acc}_${s}` : s) : acc; + +/** + * Build series name with prefix. + * @param {string} prefix - Prefix to prepend + * @param {string} acc - Accumulated name + * @returns {string} + */ +const _p = (prefix, acc) => acc ? `${prefix}_${acc}` : prefix; + + +// Index group constants and factory + +const _i1 = /** @type {const} */ (["minute10", "minute30", "hour1", "hour4", "hour12", "day1", "day3", "week1", "month1", "month3", "month6", "year1", "year10", "halving", "epoch", "height"]); +const _i2 = /** @type {const} */ (["minute10", "minute30", "hour1", "hour4", "hour12", "day1", "day3", "week1", "month1", "month3", "month6", "year1", "year10", "halving", "epoch"]); +const _i3 = /** @type {const} */ (["minute10"]); +const _i4 = /** @type {const} */ (["minute30"]); +const _i5 = /** @type {const} */ (["hour1"]); +const _i6 = /** @type {const} */ (["hour4"]); +const _i7 = /** @type {const} */ (["hour12"]); +const _i8 = /** @type {const} */ (["day1"]); +const _i9 = /** @type {const} */ (["day3"]); +const _i10 = /** @type {const} */ (["week1"]); +const _i11 = /** @type {const} */ (["month1"]); +const _i12 = /** @type {const} */ (["month3"]); +const _i13 = /** @type {const} */ (["month6"]); +const _i14 = /** @type {const} */ (["year1"]); +const _i15 = /** @type {const} */ (["year10"]); +const _i16 = /** @type {const} */ (["halving"]); +const _i17 = /** @type {const} */ (["epoch"]); +const _i18 = /** @type {const} */ (["height"]); +const _i19 = /** @type {const} */ (["tx_index"]); +const _i20 = /** @type {const} */ (["txin_index"]); +const _i21 = /** @type {const} */ (["txout_index"]); +const _i22 = /** @type {const} */ (["empty_output_index"]); +const _i23 = /** @type {const} */ (["op_return_index"]); +const _i24 = /** @type {const} */ (["p2a_addr_index"]); +const _i25 = /** @type {const} */ (["p2ms_output_index"]); +const _i26 = /** @type {const} */ (["p2pk33_addr_index"]); +const _i27 = /** @type {const} */ (["p2pk65_addr_index"]); +const _i28 = /** @type {const} */ (["p2pkh_addr_index"]); +const _i29 = /** @type {const} */ (["p2sh_addr_index"]); +const _i30 = /** @type {const} */ (["p2tr_addr_index"]); +const _i31 = /** @type {const} */ (["p2wpkh_addr_index"]); +const _i32 = /** @type {const} */ (["p2wsh_addr_index"]); +const _i33 = /** @type {const} */ (["unknown_output_index"]); +const _i34 = /** @type {const} */ (["funded_addr_index"]); +const _i35 = /** @type {const} */ (["empty_addr_index"]); + +/** + * Generic series pattern factory. + * @template T + * @param {BrkClient} client + * @param {string} name - The series vec name + * @param {readonly Index[]} indexes - The supported indexes + */ +function _mp(client, name, indexes) { + const by = {}; + for (const idx of indexes) { + Object.defineProperty(by, idx, { + get() { return _endpoint(client, name, idx); }, + enumerable: true, + configurable: true + }); + } + return { + name, + by, + /** @returns {readonly Index[]} */ + indexes() { return indexes; }, + /** @param {Index} index @returns {SeriesEndpoint|undefined} */ + get(index) { return indexes.includes(index) ? _endpoint(client, name, index) : undefined; } + }; +} + +/** @template T @typedef {{ name: string, by: { readonly minute10: DateSeriesEndpoint, readonly minute30: DateSeriesEndpoint, readonly hour1: DateSeriesEndpoint, readonly hour4: DateSeriesEndpoint, readonly hour12: DateSeriesEndpoint, readonly day1: DateSeriesEndpoint, readonly day3: DateSeriesEndpoint, readonly week1: DateSeriesEndpoint, readonly month1: DateSeriesEndpoint, readonly month3: DateSeriesEndpoint, readonly month6: DateSeriesEndpoint, readonly year1: DateSeriesEndpoint, readonly year10: DateSeriesEndpoint, readonly halving: SeriesEndpoint, readonly epoch: SeriesEndpoint, readonly height: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern1 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern1} */ +function createSeriesPattern1(client, name) { return /** @type {SeriesPattern1} */ (_mp(client, name, _i1)); } +/** @template T @typedef {{ name: string, by: { readonly minute10: DateSeriesEndpoint, readonly minute30: DateSeriesEndpoint, readonly hour1: DateSeriesEndpoint, readonly hour4: DateSeriesEndpoint, readonly hour12: DateSeriesEndpoint, readonly day1: DateSeriesEndpoint, readonly day3: DateSeriesEndpoint, readonly week1: DateSeriesEndpoint, readonly month1: DateSeriesEndpoint, readonly month3: DateSeriesEndpoint, readonly month6: DateSeriesEndpoint, readonly year1: DateSeriesEndpoint, readonly year10: DateSeriesEndpoint, readonly halving: SeriesEndpoint, readonly epoch: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern2 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern2} */ +function createSeriesPattern2(client, name) { return /** @type {SeriesPattern2} */ (_mp(client, name, _i2)); } +/** @template T @typedef {{ name: string, by: { readonly minute10: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern3 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern3} */ +function createSeriesPattern3(client, name) { return /** @type {SeriesPattern3} */ (_mp(client, name, _i3)); } +/** @template T @typedef {{ name: string, by: { readonly minute30: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern4 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern4} */ +function createSeriesPattern4(client, name) { return /** @type {SeriesPattern4} */ (_mp(client, name, _i4)); } +/** @template T @typedef {{ name: string, by: { readonly hour1: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern5 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern5} */ +function createSeriesPattern5(client, name) { return /** @type {SeriesPattern5} */ (_mp(client, name, _i5)); } +/** @template T @typedef {{ name: string, by: { readonly hour4: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern6 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern6} */ +function createSeriesPattern6(client, name) { return /** @type {SeriesPattern6} */ (_mp(client, name, _i6)); } +/** @template T @typedef {{ name: string, by: { readonly hour12: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern7 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern7} */ +function createSeriesPattern7(client, name) { return /** @type {SeriesPattern7} */ (_mp(client, name, _i7)); } +/** @template T @typedef {{ name: string, by: { readonly day1: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern8 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern8} */ +function createSeriesPattern8(client, name) { return /** @type {SeriesPattern8} */ (_mp(client, name, _i8)); } +/** @template T @typedef {{ name: string, by: { readonly day3: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern9 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern9} */ +function createSeriesPattern9(client, name) { return /** @type {SeriesPattern9} */ (_mp(client, name, _i9)); } +/** @template T @typedef {{ name: string, by: { readonly week1: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern10 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern10} */ +function createSeriesPattern10(client, name) { return /** @type {SeriesPattern10} */ (_mp(client, name, _i10)); } +/** @template T @typedef {{ name: string, by: { readonly month1: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern11 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern11} */ +function createSeriesPattern11(client, name) { return /** @type {SeriesPattern11} */ (_mp(client, name, _i11)); } +/** @template T @typedef {{ name: string, by: { readonly month3: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern12 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern12} */ +function createSeriesPattern12(client, name) { return /** @type {SeriesPattern12} */ (_mp(client, name, _i12)); } +/** @template T @typedef {{ name: string, by: { readonly month6: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern13 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern13} */ +function createSeriesPattern13(client, name) { return /** @type {SeriesPattern13} */ (_mp(client, name, _i13)); } +/** @template T @typedef {{ name: string, by: { readonly year1: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern14 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern14} */ +function createSeriesPattern14(client, name) { return /** @type {SeriesPattern14} */ (_mp(client, name, _i14)); } +/** @template T @typedef {{ name: string, by: { readonly year10: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern15 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern15} */ +function createSeriesPattern15(client, name) { return /** @type {SeriesPattern15} */ (_mp(client, name, _i15)); } +/** @template T @typedef {{ name: string, by: { readonly halving: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern16 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern16} */ +function createSeriesPattern16(client, name) { return /** @type {SeriesPattern16} */ (_mp(client, name, _i16)); } +/** @template T @typedef {{ name: string, by: { readonly epoch: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern17 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern17} */ +function createSeriesPattern17(client, name) { return /** @type {SeriesPattern17} */ (_mp(client, name, _i17)); } +/** @template T @typedef {{ name: string, by: { readonly height: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern18 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern18} */ +function createSeriesPattern18(client, name) { return /** @type {SeriesPattern18} */ (_mp(client, name, _i18)); } +/** @template T @typedef {{ name: string, by: { readonly tx_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern19 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern19} */ +function createSeriesPattern19(client, name) { return /** @type {SeriesPattern19} */ (_mp(client, name, _i19)); } +/** @template T @typedef {{ name: string, by: { readonly txin_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern20 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern20} */ +function createSeriesPattern20(client, name) { return /** @type {SeriesPattern20} */ (_mp(client, name, _i20)); } +/** @template T @typedef {{ name: string, by: { readonly txout_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern21 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern21} */ +function createSeriesPattern21(client, name) { return /** @type {SeriesPattern21} */ (_mp(client, name, _i21)); } +/** @template T @typedef {{ name: string, by: { readonly empty_output_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern22 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern22} */ +function createSeriesPattern22(client, name) { return /** @type {SeriesPattern22} */ (_mp(client, name, _i22)); } +/** @template T @typedef {{ name: string, by: { readonly op_return_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern23 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern23} */ +function createSeriesPattern23(client, name) { return /** @type {SeriesPattern23} */ (_mp(client, name, _i23)); } +/** @template T @typedef {{ name: string, by: { readonly p2a_addr_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern24 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern24} */ +function createSeriesPattern24(client, name) { return /** @type {SeriesPattern24} */ (_mp(client, name, _i24)); } +/** @template T @typedef {{ name: string, by: { readonly p2ms_output_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern25 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern25} */ +function createSeriesPattern25(client, name) { return /** @type {SeriesPattern25} */ (_mp(client, name, _i25)); } +/** @template T @typedef {{ name: string, by: { readonly p2pk33_addr_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern26 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern26} */ +function createSeriesPattern26(client, name) { return /** @type {SeriesPattern26} */ (_mp(client, name, _i26)); } +/** @template T @typedef {{ name: string, by: { readonly p2pk65_addr_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern27 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern27} */ +function createSeriesPattern27(client, name) { return /** @type {SeriesPattern27} */ (_mp(client, name, _i27)); } +/** @template T @typedef {{ name: string, by: { readonly p2pkh_addr_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern28 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern28} */ +function createSeriesPattern28(client, name) { return /** @type {SeriesPattern28} */ (_mp(client, name, _i28)); } +/** @template T @typedef {{ name: string, by: { readonly p2sh_addr_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern29 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern29} */ +function createSeriesPattern29(client, name) { return /** @type {SeriesPattern29} */ (_mp(client, name, _i29)); } +/** @template T @typedef {{ name: string, by: { readonly p2tr_addr_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern30 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern30} */ +function createSeriesPattern30(client, name) { return /** @type {SeriesPattern30} */ (_mp(client, name, _i30)); } +/** @template T @typedef {{ name: string, by: { readonly p2wpkh_addr_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern31 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern31} */ +function createSeriesPattern31(client, name) { return /** @type {SeriesPattern31} */ (_mp(client, name, _i31)); } +/** @template T @typedef {{ name: string, by: { readonly p2wsh_addr_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern32 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern32} */ +function createSeriesPattern32(client, name) { return /** @type {SeriesPattern32} */ (_mp(client, name, _i32)); } +/** @template T @typedef {{ name: string, by: { readonly unknown_output_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern33 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern33} */ +function createSeriesPattern33(client, name) { return /** @type {SeriesPattern33} */ (_mp(client, name, _i33)); } +/** @template T @typedef {{ name: string, by: { readonly funded_addr_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern34 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern34} */ +function createSeriesPattern34(client, name) { return /** @type {SeriesPattern34} */ (_mp(client, name, _i34)); } +/** @template T @typedef {{ name: string, by: { readonly empty_addr_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern35 */ +/** @template T @param {BrkClient} client @param {string} name @returns {SeriesPattern35} */ +function createSeriesPattern35(client, name) { return /** @type {SeriesPattern35} */ (_mp(client, name, _i35)); } + +// Reusable structural pattern factories + +/** + * @typedef {Object} Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern + * @property {CentsSatsUsdPattern} pct05 + * @property {CentsSatsUsdPattern} pct10 + * @property {CentsSatsUsdPattern} pct15 + * @property {CentsSatsUsdPattern} pct20 + * @property {CentsSatsUsdPattern} pct25 + * @property {CentsSatsUsdPattern} pct30 + * @property {CentsSatsUsdPattern} pct35 + * @property {CentsSatsUsdPattern} pct40 + * @property {CentsSatsUsdPattern} pct45 + * @property {CentsSatsUsdPattern} pct50 + * @property {CentsSatsUsdPattern} pct55 + * @property {CentsSatsUsdPattern} pct60 + * @property {CentsSatsUsdPattern} pct65 + * @property {CentsSatsUsdPattern} pct70 + * @property {CentsSatsUsdPattern} pct75 + * @property {CentsSatsUsdPattern} pct80 + * @property {CentsSatsUsdPattern} pct85 + * @property {CentsSatsUsdPattern} pct90 + * @property {CentsSatsUsdPattern} pct95 + */ + +/** + * Create a Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} + */ +function createPct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(client, acc) { + return { + pct05: createCentsSatsUsdPattern(client, _m(acc, 'pct05')), + pct10: createCentsSatsUsdPattern(client, _m(acc, 'pct10')), + pct15: createCentsSatsUsdPattern(client, _m(acc, 'pct15')), + pct20: createCentsSatsUsdPattern(client, _m(acc, 'pct20')), + pct25: createCentsSatsUsdPattern(client, _m(acc, 'pct25')), + pct30: createCentsSatsUsdPattern(client, _m(acc, 'pct30')), + pct35: createCentsSatsUsdPattern(client, _m(acc, 'pct35')), + pct40: createCentsSatsUsdPattern(client, _m(acc, 'pct40')), + pct45: createCentsSatsUsdPattern(client, _m(acc, 'pct45')), + pct50: createCentsSatsUsdPattern(client, _m(acc, 'pct50')), + pct55: createCentsSatsUsdPattern(client, _m(acc, 'pct55')), + pct60: createCentsSatsUsdPattern(client, _m(acc, 'pct60')), + pct65: createCentsSatsUsdPattern(client, _m(acc, 'pct65')), + pct70: createCentsSatsUsdPattern(client, _m(acc, 'pct70')), + pct75: createCentsSatsUsdPattern(client, _m(acc, 'pct75')), + pct80: createCentsSatsUsdPattern(client, _m(acc, 'pct80')), + pct85: createCentsSatsUsdPattern(client, _m(acc, 'pct85')), + pct90: createCentsSatsUsdPattern(client, _m(acc, 'pct90')), + pct95: createCentsSatsUsdPattern(client, _m(acc, 'pct95')), + }; +} + +/** + * @typedef {Object} _0sdM0M1M1sdM2M2sdM3sdP0P1P1sdP2P2sdP3sdSdZscorePattern + * @property {CentsSatsUsdPattern} _0sd + * @property {PriceRatioPattern} m05sd + * @property {PriceRatioPattern} m15sd + * @property {PriceRatioPattern} m1sd + * @property {PriceRatioPattern} m25sd + * @property {PriceRatioPattern} m2sd + * @property {PriceRatioPattern} m3sd + * @property {PriceRatioPattern} p05sd + * @property {PriceRatioPattern} p15sd + * @property {PriceRatioPattern} p1sd + * @property {PriceRatioPattern} p25sd + * @property {PriceRatioPattern} p2sd + * @property {PriceRatioPattern} p3sd + * @property {SeriesPattern1} sd + * @property {SeriesPattern1} zscore + */ + +/** + * @typedef {Object} AllEmptyOpP2aP2msP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshUnknownPattern + * @property {AverageBlockCumulativeSumPattern} all + * @property {AverageBlockCumulativeSumPattern} empty + * @property {AverageBlockCumulativeSumPattern} opReturn + * @property {AverageBlockCumulativeSumPattern} p2a + * @property {AverageBlockCumulativeSumPattern} p2ms + * @property {AverageBlockCumulativeSumPattern} p2pk33 + * @property {AverageBlockCumulativeSumPattern} p2pk65 + * @property {AverageBlockCumulativeSumPattern} p2pkh + * @property {AverageBlockCumulativeSumPattern} p2sh + * @property {AverageBlockCumulativeSumPattern} p2tr + * @property {AverageBlockCumulativeSumPattern} p2wpkh + * @property {AverageBlockCumulativeSumPattern} p2wsh + * @property {AverageBlockCumulativeSumPattern} unknown + */ + +/** + * Create a AllEmptyOpP2aP2msP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshUnknownPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {AllEmptyOpP2aP2msP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshUnknownPattern} + */ +function createAllEmptyOpP2aP2msP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshUnknownPattern(client, acc) { + return { + all: createAverageBlockCumulativeSumPattern(client, _m(acc, 'bis')), + empty: createAverageBlockCumulativeSumPattern(client, _m(acc, 'with_empty_outputs_output')), + opReturn: createAverageBlockCumulativeSumPattern(client, _m(acc, 'with_op_return_output')), + p2a: createAverageBlockCumulativeSumPattern(client, _m(acc, 'with_p2a_output')), + p2ms: createAverageBlockCumulativeSumPattern(client, _m(acc, 'with_p2ms_output')), + p2pk33: createAverageBlockCumulativeSumPattern(client, _m(acc, 'with_p2pk33_output')), + p2pk65: createAverageBlockCumulativeSumPattern(client, _m(acc, 'with_p2pk65_output')), + p2pkh: createAverageBlockCumulativeSumPattern(client, _m(acc, 'with_p2pkh_output')), + p2sh: createAverageBlockCumulativeSumPattern(client, _m(acc, 'with_p2sh_output')), + p2tr: createAverageBlockCumulativeSumPattern(client, _m(acc, 'with_p2tr_output')), + p2wpkh: createAverageBlockCumulativeSumPattern(client, _m(acc, 'with_p2wpkh_output')), + p2wsh: createAverageBlockCumulativeSumPattern(client, _m(acc, 'with_p2wsh_output')), + unknown: createAverageBlockCumulativeSumPattern(client, _m(acc, 'with_unknown_outputs_output')), + }; +} + +/** + * @typedef {Object} _10y1m1w1y2y3m3y4y5y6m6y8yPattern2 + * @property {BpsPercentRatioPattern} _10y + * @property {BpsPercentRatioPattern} _1m + * @property {BpsPercentRatioPattern} _1w + * @property {BpsPercentRatioPattern} _1y + * @property {BpsPercentRatioPattern} _2y + * @property {BpsPercentRatioPattern} _3m + * @property {BpsPercentRatioPattern} _3y + * @property {BpsPercentRatioPattern} _4y + * @property {BpsPercentRatioPattern} _5y + * @property {BpsPercentRatioPattern} _6m + * @property {BpsPercentRatioPattern} _6y + * @property {BpsPercentRatioPattern} _8y + */ + +/** + * Create a _10y1m1w1y2y3m3y4y5y6m6y8yPattern2 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {_10y1m1w1y2y3m3y4y5y6m6y8yPattern2} + */ +function create_10y1m1w1y2y3m3y4y5y6m6y8yPattern2(client, acc) { + return { + _10y: createBpsPercentRatioPattern(client, _m(acc, '10y')), + _1m: createBpsPercentRatioPattern(client, _m(acc, '1m')), + _1w: createBpsPercentRatioPattern(client, _m(acc, '1w')), + _1y: createBpsPercentRatioPattern(client, _m(acc, '1y')), + _2y: createBpsPercentRatioPattern(client, _m(acc, '2y')), + _3m: createBpsPercentRatioPattern(client, _m(acc, '3m')), + _3y: createBpsPercentRatioPattern(client, _m(acc, '3y')), + _4y: createBpsPercentRatioPattern(client, _m(acc, '4y')), + _5y: createBpsPercentRatioPattern(client, _m(acc, '5y')), + _6m: createBpsPercentRatioPattern(client, _m(acc, '6m')), + _6y: createBpsPercentRatioPattern(client, _m(acc, '6y')), + _8y: createBpsPercentRatioPattern(client, _m(acc, '8y')), + }; +} + +/** + * @typedef {Object} _10y1m1w1y2y3m3y4y5y6m6y8yPattern3 + * @property {BtcCentsSatsUsdPattern} _10y + * @property {BtcCentsSatsUsdPattern} _1m + * @property {BtcCentsSatsUsdPattern} _1w + * @property {BtcCentsSatsUsdPattern} _1y + * @property {BtcCentsSatsUsdPattern} _2y + * @property {BtcCentsSatsUsdPattern} _3m + * @property {BtcCentsSatsUsdPattern} _3y + * @property {BtcCentsSatsUsdPattern} _4y + * @property {BtcCentsSatsUsdPattern} _5y + * @property {BtcCentsSatsUsdPattern} _6m + * @property {BtcCentsSatsUsdPattern} _6y + * @property {BtcCentsSatsUsdPattern} _8y + */ + +/** + * Create a _10y1m1w1y2y3m3y4y5y6m6y8yPattern3 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {_10y1m1w1y2y3m3y4y5y6m6y8yPattern3} + */ +function create_10y1m1w1y2y3m3y4y5y6m6y8yPattern3(client, acc) { + return { + _10y: createBtcCentsSatsUsdPattern(client, _m(acc, '10y')), + _1m: createBtcCentsSatsUsdPattern(client, _m(acc, '1m')), + _1w: createBtcCentsSatsUsdPattern(client, _m(acc, '1w')), + _1y: createBtcCentsSatsUsdPattern(client, _m(acc, '1y')), + _2y: createBtcCentsSatsUsdPattern(client, _m(acc, '2y')), + _3m: createBtcCentsSatsUsdPattern(client, _m(acc, '3m')), + _3y: createBtcCentsSatsUsdPattern(client, _m(acc, '3y')), + _4y: createBtcCentsSatsUsdPattern(client, _m(acc, '4y')), + _5y: createBtcCentsSatsUsdPattern(client, _m(acc, '5y')), + _6m: createBtcCentsSatsUsdPattern(client, _m(acc, '6m')), + _6y: createBtcCentsSatsUsdPattern(client, _m(acc, '6y')), + _8y: createBtcCentsSatsUsdPattern(client, _m(acc, '8y')), + }; +} + +/** + * @typedef {Object} AllEmptyP2aP2msP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshUnknownPattern + * @property {AverageBlockCumulativeSumPattern} all + * @property {AverageBlockCumulativeSumPattern} empty + * @property {AverageBlockCumulativeSumPattern} p2a + * @property {AverageBlockCumulativeSumPattern} p2ms + * @property {AverageBlockCumulativeSumPattern} p2pk33 + * @property {AverageBlockCumulativeSumPattern} p2pk65 + * @property {AverageBlockCumulativeSumPattern} p2pkh + * @property {AverageBlockCumulativeSumPattern} p2sh + * @property {AverageBlockCumulativeSumPattern} p2tr + * @property {AverageBlockCumulativeSumPattern} p2wpkh + * @property {AverageBlockCumulativeSumPattern} p2wsh + * @property {AverageBlockCumulativeSumPattern} unknown + */ + +/** + * @typedef {Object} CapCapitalizedGrossLossMvrvNetPeakPriceProfitSellSoprPattern + * @property {CentsDeltaToUsdPattern} cap + * @property {PricePattern} capitalized + * @property {BlockCumulativeSumPattern} grossPnl + * @property {BlockCumulativeNegativeSumPattern} loss + * @property {SeriesPattern1} mvrv + * @property {BlockChangeCumulativeDeltaSumPattern} netPnl + * @property {BlockCumulativeSumPattern} peakRegret + * @property {BpsCentsPercentilesRatioSatsSmaStdUsdPattern} price + * @property {BlockCumulativeSumPattern} profit + * @property {_1m1w1y24hPattern} profitToLossRatio + * @property {_1m1w1y24hPattern8} sellSideRiskRatio + * @property {AdjustedRatioValuePattern} sopr + */ + +/** + * @typedef {Object} EmptyOpP2aP2msP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshUnknownPattern2 + * @property {_1m1w1y24hBpsPercentRatioPattern} empty + * @property {_1m1w1y24hBpsPercentRatioPattern} opReturn + * @property {_1m1w1y24hBpsPercentRatioPattern} p2a + * @property {_1m1w1y24hBpsPercentRatioPattern} p2ms + * @property {_1m1w1y24hBpsPercentRatioPattern} p2pk33 + * @property {_1m1w1y24hBpsPercentRatioPattern} p2pk65 + * @property {_1m1w1y24hBpsPercentRatioPattern} p2pkh + * @property {_1m1w1y24hBpsPercentRatioPattern} p2sh + * @property {_1m1w1y24hBpsPercentRatioPattern} p2tr + * @property {_1m1w1y24hBpsPercentRatioPattern} p2wpkh + * @property {_1m1w1y24hBpsPercentRatioPattern} p2wsh + * @property {_1m1w1y24hBpsPercentRatioPattern} unknown + */ + +/** + * Create a EmptyOpP2aP2msP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshUnknownPattern2 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {EmptyOpP2aP2msP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshUnknownPattern2} + */ +function createEmptyOpP2aP2msP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshUnknownPattern2(client, acc) { + return { + empty: create_1m1w1y24hBpsPercentRatioPattern(client, _m(acc, 'empty_outputs_output')), + opReturn: create_1m1w1y24hBpsPercentRatioPattern(client, _m(acc, 'op_return_output')), + p2a: create_1m1w1y24hBpsPercentRatioPattern(client, _m(acc, 'p2a_output')), + p2ms: create_1m1w1y24hBpsPercentRatioPattern(client, _m(acc, 'p2ms_output')), + p2pk33: create_1m1w1y24hBpsPercentRatioPattern(client, _m(acc, 'p2pk33_output')), + p2pk65: create_1m1w1y24hBpsPercentRatioPattern(client, _m(acc, 'p2pk65_output')), + p2pkh: create_1m1w1y24hBpsPercentRatioPattern(client, _m(acc, 'p2pkh_output')), + p2sh: create_1m1w1y24hBpsPercentRatioPattern(client, _m(acc, 'p2sh_output')), + p2tr: create_1m1w1y24hBpsPercentRatioPattern(client, _m(acc, 'p2tr_output')), + p2wpkh: create_1m1w1y24hBpsPercentRatioPattern(client, _m(acc, 'p2wpkh_output')), + p2wsh: create_1m1w1y24hBpsPercentRatioPattern(client, _m(acc, 'p2wsh_output')), + unknown: create_1m1w1y24hBpsPercentRatioPattern(client, _m(acc, 'unknown_outputs_output')), + }; +} + +/** + * @typedef {Object} AverageBlockCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern + * @property {_1m1w1y24hPattern} average + * @property {SeriesPattern18} block + * @property {SeriesPattern1} cumulative + * @property {_1m1w1y24hPattern} max + * @property {_1m1w1y24hPattern} median + * @property {_1m1w1y24hPattern} min + * @property {_1m1w1y24hPattern} pct10 + * @property {_1m1w1y24hPattern} pct25 + * @property {_1m1w1y24hPattern} pct75 + * @property {_1m1w1y24hPattern} pct90 + * @property {_1m1w1y24hPattern} sum + */ + +/** + * Create a AverageBlockCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {AverageBlockCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern} + */ +function createAverageBlockCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern(client, acc) { + return { + average: create_1m1w1y24hPattern(client, _m(acc, 'average')), + block: createSeriesPattern18(client, acc), + cumulative: createSeriesPattern1(client, _m(acc, 'cumulative')), + max: create_1m1w1y24hPattern(client, _m(acc, 'max')), + median: create_1m1w1y24hPattern(client, _m(acc, 'median')), + min: create_1m1w1y24hPattern(client, _m(acc, 'min')), + pct10: create_1m1w1y24hPattern(client, _m(acc, 'pct10')), + pct25: create_1m1w1y24hPattern(client, _m(acc, 'pct25')), + pct75: create_1m1w1y24hPattern(client, _m(acc, 'pct75')), + pct90: create_1m1w1y24hPattern(client, _m(acc, 'pct90')), + sum: create_1m1w1y24hPattern(client, _m(acc, 'sum')), + }; +} + +/** + * @typedef {Object} EmptyP2aP2msP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshUnknownPattern2 + * @property {_1m1w1y24hBpsPercentRatioPattern} empty + * @property {_1m1w1y24hBpsPercentRatioPattern} p2a + * @property {_1m1w1y24hBpsPercentRatioPattern} p2ms + * @property {_1m1w1y24hBpsPercentRatioPattern} p2pk33 + * @property {_1m1w1y24hBpsPercentRatioPattern} p2pk65 + * @property {_1m1w1y24hBpsPercentRatioPattern} p2pkh + * @property {_1m1w1y24hBpsPercentRatioPattern} p2sh + * @property {_1m1w1y24hBpsPercentRatioPattern} p2tr + * @property {_1m1w1y24hBpsPercentRatioPattern} p2wpkh + * @property {_1m1w1y24hBpsPercentRatioPattern} p2wsh + * @property {_1m1w1y24hBpsPercentRatioPattern} unknown + */ + +/** + * Create a EmptyP2aP2msP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshUnknownPattern2 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {EmptyP2aP2msP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshUnknownPattern2} + */ +function createEmptyP2aP2msP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshUnknownPattern2(client, acc) { + return { + empty: create_1m1w1y24hBpsPercentRatioPattern(client, _m(acc, 'empty_outputs_prevout')), + p2a: create_1m1w1y24hBpsPercentRatioPattern(client, _m(acc, 'p2a_prevout')), + p2ms: create_1m1w1y24hBpsPercentRatioPattern(client, _m(acc, 'p2ms_prevout')), + p2pk33: create_1m1w1y24hBpsPercentRatioPattern(client, _m(acc, 'p2pk33_prevout')), + p2pk65: create_1m1w1y24hBpsPercentRatioPattern(client, _m(acc, 'p2pk65_prevout')), + p2pkh: create_1m1w1y24hBpsPercentRatioPattern(client, _m(acc, 'p2pkh_prevout')), + p2sh: create_1m1w1y24hBpsPercentRatioPattern(client, _m(acc, 'p2sh_prevout')), + p2tr: create_1m1w1y24hBpsPercentRatioPattern(client, _m(acc, 'p2tr_prevout')), + p2wpkh: create_1m1w1y24hBpsPercentRatioPattern(client, _m(acc, 'p2wpkh_prevout')), + p2wsh: create_1m1w1y24hBpsPercentRatioPattern(client, _m(acc, 'p2wsh_prevout')), + unknown: create_1m1w1y24hBpsPercentRatioPattern(client, _m(acc, 'unknown_outputs_prevout')), + }; +} + +/** + * @template T + * @typedef {Object} AverageBaseCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern + * @property {_1m1w1y24hPattern} average + * @property {SeriesPattern18} base + * @property {SeriesPattern1} cumulative + * @property {_1m1w1y24hPattern} max + * @property {_1m1w1y24hPattern} median + * @property {_1m1w1y24hPattern} min + * @property {_1m1w1y24hPattern} pct10 + * @property {_1m1w1y24hPattern} pct25 + * @property {_1m1w1y24hPattern} pct75 + * @property {_1m1w1y24hPattern} pct90 + * @property {_1m1w1y24hPattern} sum + */ + +/** + * Create a AverageBaseCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern pattern node + * @template T + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {AverageBaseCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern} + */ +function createAverageBaseCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern(client, acc) { + return { + average: create_1m1w1y24hPattern(client, _m(acc, 'average')), + base: createSeriesPattern18(client, acc), + cumulative: createSeriesPattern1(client, _m(acc, 'cumulative')), + max: create_1m1w1y24hPattern(client, _m(acc, 'max')), + median: create_1m1w1y24hPattern(client, _m(acc, 'median')), + min: create_1m1w1y24hPattern(client, _m(acc, 'min')), + pct10: create_1m1w1y24hPattern(client, _m(acc, 'pct10')), + pct25: create_1m1w1y24hPattern(client, _m(acc, 'pct25')), + pct75: create_1m1w1y24hPattern(client, _m(acc, 'pct75')), + pct90: create_1m1w1y24hPattern(client, _m(acc, 'pct90')), + sum: create_1m1w1y24hPattern(client, _m(acc, 'sum')), + }; +} + +/** + * @typedef {Object} AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshSharePattern + * @property {BtcCentsSatsUsdPattern} all + * @property {BtcCentsSatsUsdPattern} p2a + * @property {BtcCentsSatsUsdPattern} p2pk33 + * @property {BtcCentsSatsUsdPattern} p2pk65 + * @property {BtcCentsSatsUsdPattern} p2pkh + * @property {BtcCentsSatsUsdPattern} p2sh + * @property {BtcCentsSatsUsdPattern} p2tr + * @property {BtcCentsSatsUsdPattern} p2wpkh + * @property {BtcCentsSatsUsdPattern} p2wsh + * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern5} share + */ + +/** + * @typedef {Object} IndexPct0Pct1Pct2Pct5Pct95Pct98Pct99ScorePattern + * @property {SeriesPattern1} index + * @property {CentsSatsUsdPattern} pct05 + * @property {CentsSatsUsdPattern} pct1 + * @property {CentsSatsUsdPattern} pct2 + * @property {CentsSatsUsdPattern} pct5 + * @property {CentsSatsUsdPattern} pct95 + * @property {CentsSatsUsdPattern} pct98 + * @property {CentsSatsUsdPattern} pct99 + * @property {CentsSatsUsdPattern} pct995 + * @property {SeriesPattern1} score + */ + +/** + * Create a IndexPct0Pct1Pct2Pct5Pct95Pct98Pct99ScorePattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {IndexPct0Pct1Pct2Pct5Pct95Pct98Pct99ScorePattern} + */ +function createIndexPct0Pct1Pct2Pct5Pct95Pct98Pct99ScorePattern(client, acc) { + return { + index: createSeriesPattern1(client, _m(acc, 'index')), + pct05: createCentsSatsUsdPattern(client, _m(acc, 'pct0_5')), + pct1: createCentsSatsUsdPattern(client, _m(acc, 'pct01')), + pct2: createCentsSatsUsdPattern(client, _m(acc, 'pct02')), + pct5: createCentsSatsUsdPattern(client, _m(acc, 'pct05')), + pct95: createCentsSatsUsdPattern(client, _m(acc, 'pct95')), + pct98: createCentsSatsUsdPattern(client, _m(acc, 'pct98')), + pct99: createCentsSatsUsdPattern(client, _m(acc, 'pct99')), + pct995: createCentsSatsUsdPattern(client, _m(acc, 'pct99_5')), + score: createSeriesPattern1(client, _m(acc, 'score')), + }; +} + +/** + * @typedef {Object} AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern6 + * @property {AverageBlockCumulativeSumPattern} all + * @property {AverageBlockCumulativeSumPattern} p2a + * @property {AverageBlockCumulativeSumPattern} p2pk33 + * @property {AverageBlockCumulativeSumPattern} p2pk65 + * @property {AverageBlockCumulativeSumPattern} p2pkh + * @property {AverageBlockCumulativeSumPattern} p2sh + * @property {AverageBlockCumulativeSumPattern} p2tr + * @property {AverageBlockCumulativeSumPattern} p2wpkh + * @property {AverageBlockCumulativeSumPattern} p2wsh + */ + +/** + * Create a AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern6 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern6} + */ +function createAllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern6(client, acc) { + return { + all: createAverageBlockCumulativeSumPattern(client, acc), + p2a: createAverageBlockCumulativeSumPattern(client, _p('p2a', acc)), + p2pk33: createAverageBlockCumulativeSumPattern(client, _p('p2pk33', acc)), + p2pk65: createAverageBlockCumulativeSumPattern(client, _p('p2pk65', acc)), + p2pkh: createAverageBlockCumulativeSumPattern(client, _p('p2pkh', acc)), + p2sh: createAverageBlockCumulativeSumPattern(client, _p('p2sh', acc)), + p2tr: createAverageBlockCumulativeSumPattern(client, _p('p2tr', acc)), + p2wpkh: createAverageBlockCumulativeSumPattern(client, _p('p2wpkh', acc)), + p2wsh: createAverageBlockCumulativeSumPattern(client, _p('p2wsh', acc)), + }; +} + +/** + * @typedef {Object} AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern5 + * @property {BpsPercentRatioPattern2} all + * @property {BpsPercentRatioPattern2} p2a + * @property {BpsPercentRatioPattern2} p2pk33 + * @property {BpsPercentRatioPattern2} p2pk65 + * @property {BpsPercentRatioPattern2} p2pkh + * @property {BpsPercentRatioPattern2} p2sh + * @property {BpsPercentRatioPattern2} p2tr + * @property {BpsPercentRatioPattern2} p2wpkh + * @property {BpsPercentRatioPattern2} p2wsh + */ + +/** + * Create a AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern5 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern5} + */ +function createAllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern5(client, acc) { + return { + all: createBpsPercentRatioPattern2(client, acc), + p2a: createBpsPercentRatioPattern2(client, _p('p2a', acc)), + p2pk33: createBpsPercentRatioPattern2(client, _p('p2pk33', acc)), + p2pk65: createBpsPercentRatioPattern2(client, _p('p2pk65', acc)), + p2pkh: createBpsPercentRatioPattern2(client, _p('p2pkh', acc)), + p2sh: createBpsPercentRatioPattern2(client, _p('p2sh', acc)), + p2tr: createBpsPercentRatioPattern2(client, _p('p2tr', acc)), + p2wpkh: createBpsPercentRatioPattern2(client, _p('p2wpkh', acc)), + p2wsh: createBpsPercentRatioPattern2(client, _p('p2wsh', acc)), + }; +} + +/** + * @typedef {Object} AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern4 + * @property {SeriesPattern1} all + * @property {SeriesPattern1} p2a + * @property {SeriesPattern1} p2pk33 + * @property {SeriesPattern1} p2pk65 + * @property {SeriesPattern1} p2pkh + * @property {SeriesPattern1} p2sh + * @property {SeriesPattern1} p2tr + * @property {SeriesPattern1} p2wpkh + * @property {SeriesPattern1} p2wsh + */ + +/** + * Create a AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern4 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern4} + */ +function createAllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern4(client, acc) { + return { + all: createSeriesPattern1(client, acc), + p2a: createSeriesPattern1(client, _p('p2a', acc)), + p2pk33: createSeriesPattern1(client, _p('p2pk33', acc)), + p2pk65: createSeriesPattern1(client, _p('p2pk65', acc)), + p2pkh: createSeriesPattern1(client, _p('p2pkh', acc)), + p2sh: createSeriesPattern1(client, _p('p2sh', acc)), + p2tr: createSeriesPattern1(client, _p('p2tr', acc)), + p2wpkh: createSeriesPattern1(client, _p('p2wpkh', acc)), + p2wsh: createSeriesPattern1(client, _p('p2wsh', acc)), + }; +} + +/** + * @typedef {Object} AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern7 + * @property {_1m1w1y24hBpsPercentRatioPattern} all + * @property {_1m1w1y24hBpsPercentRatioPattern} p2a + * @property {_1m1w1y24hBpsPercentRatioPattern} p2pk33 + * @property {_1m1w1y24hBpsPercentRatioPattern} p2pk65 + * @property {_1m1w1y24hBpsPercentRatioPattern} p2pkh + * @property {_1m1w1y24hBpsPercentRatioPattern} p2sh + * @property {_1m1w1y24hBpsPercentRatioPattern} p2tr + * @property {_1m1w1y24hBpsPercentRatioPattern} p2wpkh + * @property {_1m1w1y24hBpsPercentRatioPattern} p2wsh + */ + +/** + * Create a AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern7 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern7} + */ +function createAllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern7(client, acc) { + return { + all: create_1m1w1y24hBpsPercentRatioPattern(client, acc), + p2a: create_1m1w1y24hBpsPercentRatioPattern(client, _p('p2a', acc)), + p2pk33: create_1m1w1y24hBpsPercentRatioPattern(client, _p('p2pk33', acc)), + p2pk65: create_1m1w1y24hBpsPercentRatioPattern(client, _p('p2pk65', acc)), + p2pkh: create_1m1w1y24hBpsPercentRatioPattern(client, _p('p2pkh', acc)), + p2sh: create_1m1w1y24hBpsPercentRatioPattern(client, _p('p2sh', acc)), + p2tr: create_1m1w1y24hBpsPercentRatioPattern(client, _p('p2tr', acc)), + p2wpkh: create_1m1w1y24hBpsPercentRatioPattern(client, _p('p2wpkh', acc)), + p2wsh: create_1m1w1y24hBpsPercentRatioPattern(client, _p('p2wsh', acc)), + }; +} + +/** + * @typedef {Object} AverageMaxMedianMinPct10Pct25Pct75Pct90SumPattern + * @property {_1m1w1y24hPattern} average + * @property {_1m1w1y24hPattern} max + * @property {_1m1w1y24hPattern} median + * @property {_1m1w1y24hPattern} min + * @property {_1m1w1y24hPattern} pct10 + * @property {_1m1w1y24hPattern} pct25 + * @property {_1m1w1y24hPattern} pct75 + * @property {_1m1w1y24hPattern} pct90 + * @property {_1m1w1y24hPattern} sum + */ + +/** + * Create a AverageMaxMedianMinPct10Pct25Pct75Pct90SumPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {AverageMaxMedianMinPct10Pct25Pct75Pct90SumPattern} + */ +function createAverageMaxMedianMinPct10Pct25Pct75Pct90SumPattern(client, acc) { + return { + average: create_1m1w1y24hPattern(client, _m(acc, 'average')), + max: create_1m1w1y24hPattern(client, _m(acc, 'max')), + median: create_1m1w1y24hPattern(client, _m(acc, 'median')), + min: create_1m1w1y24hPattern(client, _m(acc, 'min')), + pct10: create_1m1w1y24hPattern(client, _m(acc, 'pct10')), + pct25: create_1m1w1y24hPattern(client, _m(acc, 'pct25')), + pct75: create_1m1w1y24hPattern(client, _m(acc, 'pct75')), + pct90: create_1m1w1y24hPattern(client, _m(acc, 'pct90')), + sum: create_1m1w1y24hPattern(client, _m(acc, 'sum')), + }; +} + +/** + * @typedef {Object} CapitalizedGrossInvestedLossNetNuplProfitSentimentPattern2 + * @property {SeriesPattern18} capitalizedCapInLossRaw + * @property {SeriesPattern18} capitalizedCapInProfitRaw + * @property {CentsUsdPattern3} grossPnl + * @property {InPattern2} investedCapital + * @property {CentsNegativeToUsdPattern2} loss + * @property {CentsToUsdPattern3} netPnl + * @property {BpsRatioPattern} nupl + * @property {CentsToUsdPattern4} profit + * @property {GreedNetPainPattern} sentiment + */ + +/** + * Create a CapitalizedGrossInvestedLossNetNuplProfitSentimentPattern2 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {CapitalizedGrossInvestedLossNetNuplProfitSentimentPattern2} + */ +function createCapitalizedGrossInvestedLossNetNuplProfitSentimentPattern2(client, acc) { + return { + capitalizedCapInLossRaw: createSeriesPattern18(client, _m(acc, 'capitalized_cap_in_loss_raw')), + capitalizedCapInProfitRaw: createSeriesPattern18(client, _m(acc, 'capitalized_cap_in_profit_raw')), + grossPnl: createCentsUsdPattern3(client, _m(acc, 'unrealized_gross_pnl')), + investedCapital: createInPattern2(client, _m(acc, 'invested_capital_in')), + loss: createCentsNegativeToUsdPattern2(client, _m(acc, 'unrealized_loss')), + netPnl: createCentsToUsdPattern3(client, _m(acc, 'net_unrealized_pnl')), + nupl: createBpsRatioPattern(client, _m(acc, 'nupl')), + profit: createCentsToUsdPattern4(client, _m(acc, 'unrealized_profit')), + sentiment: createGreedNetPainPattern(client, acc), + }; +} + +/** + * @typedef {Object} BpsCentsPercentilesRatioSatsSmaStdUsdPattern + * @property {SeriesPattern1} bps + * @property {SeriesPattern1} cents + * @property {Pct0Pct1Pct2Pct5Pct95Pct98Pct99Pattern} percentiles + * @property {SeriesPattern1} ratio + * @property {SeriesPattern1} sats + * @property {_1m1w1y2y4yAllPattern} sma + * @property {_1y2y4yAllPattern} stdDev + * @property {SeriesPattern1} usd + */ + +/** + * @typedef {Object} Pct0Pct1Pct2Pct5Pct95Pct98Pct99Pattern + * @property {BpsPriceRatioPattern} pct05 + * @property {BpsPriceRatioPattern} pct1 + * @property {BpsPriceRatioPattern} pct2 + * @property {BpsPriceRatioPattern} pct5 + * @property {BpsPriceRatioPattern} pct95 + * @property {BpsPriceRatioPattern} pct98 + * @property {BpsPriceRatioPattern} pct99 + * @property {BpsPriceRatioPattern} pct995 + */ + +/** + * Create a Pct0Pct1Pct2Pct5Pct95Pct98Pct99Pattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {Pct0Pct1Pct2Pct5Pct95Pct98Pct99Pattern} + */ +function createPct0Pct1Pct2Pct5Pct95Pct98Pct99Pattern(client, acc) { + return { + pct05: createBpsPriceRatioPattern(client, acc, 'pct0_5'), + pct1: createBpsPriceRatioPattern(client, acc, 'pct1'), + pct2: createBpsPriceRatioPattern(client, acc, 'pct2'), + pct5: createBpsPriceRatioPattern(client, acc, 'pct5'), + pct95: createBpsPriceRatioPattern(client, acc, 'pct95'), + pct98: createBpsPriceRatioPattern(client, acc, 'pct98'), + pct99: createBpsPriceRatioPattern(client, acc, 'pct99'), + pct995: createBpsPriceRatioPattern(client, acc, 'pct99_5'), + }; +} + +/** + * @typedef {Object} _10y2y3y4y5y6y8yPattern + * @property {BpsPercentRatioPattern} _10y + * @property {BpsPercentRatioPattern} _2y + * @property {BpsPercentRatioPattern} _3y + * @property {BpsPercentRatioPattern} _4y + * @property {BpsPercentRatioPattern} _5y + * @property {BpsPercentRatioPattern} _6y + * @property {BpsPercentRatioPattern} _8y + */ + +/** + * Create a _10y2y3y4y5y6y8yPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {_10y2y3y4y5y6y8yPattern} + */ +function create_10y2y3y4y5y6y8yPattern(client, acc) { + return { + _10y: createBpsPercentRatioPattern(client, _m(acc, '10y')), + _2y: createBpsPercentRatioPattern(client, _m(acc, '2y')), + _3y: createBpsPercentRatioPattern(client, _m(acc, '3y')), + _4y: createBpsPercentRatioPattern(client, _m(acc, '4y')), + _5y: createBpsPercentRatioPattern(client, _m(acc, '5y')), + _6y: createBpsPercentRatioPattern(client, _m(acc, '6y')), + _8y: createBpsPercentRatioPattern(client, _m(acc, '8y')), + }; +} + +/** + * @typedef {Object} _1m1w1y24hBpsPercentRatioPattern + * @property {BpsPercentRatioPattern2} _1m + * @property {BpsPercentRatioPattern2} _1w + * @property {BpsPercentRatioPattern2} _1y + * @property {BpsPercentRatioPattern2} _24h + * @property {SeriesPattern1} bps + * @property {SeriesPattern1} percent + * @property {SeriesPattern1} ratio + */ + +/** + * Create a _1m1w1y24hBpsPercentRatioPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {_1m1w1y24hBpsPercentRatioPattern} + */ +function create_1m1w1y24hBpsPercentRatioPattern(client, acc) { + return { + _1m: createBpsPercentRatioPattern2(client, _m(acc, '1m')), + _1w: createBpsPercentRatioPattern2(client, _m(acc, '1w')), + _1y: createBpsPercentRatioPattern2(client, _m(acc, '1y')), + _24h: createBpsPercentRatioPattern2(client, _m(acc, '24h')), + bps: createSeriesPattern1(client, _m(acc, 'bps')), + percent: createSeriesPattern1(client, acc), + ratio: createSeriesPattern1(client, _m(acc, 'ratio')), + }; +} + +/** + * @typedef {Object} ActiveInputOutputSpendablePattern + * @property {_1m1w1y24hBlockPattern} activeReusedAddrCount + * @property {_1m1w1y24hBlockPattern2} activeReusedAddrShare + * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern6} inputFromReusedAddrCount + * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern7} inputFromReusedAddrShare + * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern6} outputToReusedAddrCount + * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern7} outputToReusedAddrShare + * @property {_1m1w1y24hBpsPercentRatioPattern} spendableOutputToReusedAddrShare + */ + +/** + * @typedef {Object} CapLossMvrvNetPriceProfitSoprPattern + * @property {CentsDeltaUsdPattern} cap + * @property {BlockCumulativeNegativeSumPattern} loss + * @property {SeriesPattern1} mvrv + * @property {BlockCumulativeDeltaSumPattern} netPnl + * @property {BpsCentsRatioSatsUsdPattern} price + * @property {BlockCumulativeSumPattern} profit + * @property {RatioValuePattern} sopr + */ + +/** + * Create a CapLossMvrvNetPriceProfitSoprPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {CapLossMvrvNetPriceProfitSoprPattern} + */ +function createCapLossMvrvNetPriceProfitSoprPattern(client, acc) { + return { + cap: createCentsDeltaUsdPattern(client, _m(acc, 'realized_cap')), + loss: createBlockCumulativeNegativeSumPattern(client, _m(acc, 'realized_loss')), + mvrv: createSeriesPattern1(client, _m(acc, 'mvrv')), + netPnl: createBlockCumulativeDeltaSumPattern(client, _m(acc, 'net_realized_pnl')), + price: createBpsCentsRatioSatsUsdPattern(client, _m(acc, 'realized_price')), + profit: createBlockCumulativeSumPattern(client, _m(acc, 'realized_profit')), + sopr: createRatioValuePattern(client, acc), + }; +} + +/** + * @typedef {Object} InMaxMinPerSupplyPattern + * @property {PerPattern} inLoss + * @property {PerPattern} inProfit + * @property {CentsSatsUsdPattern} max + * @property {CentsSatsUsdPattern} min + * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} perCoin + * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} perDollar + * @property {BpsPercentRatioPattern2} supplyDensity + */ + +/** + * Create a InMaxMinPerSupplyPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {InMaxMinPerSupplyPattern} + */ +function createInMaxMinPerSupplyPattern(client, acc) { + return { + inLoss: createPerPattern(client, _m(acc, 'cost_basis_in_loss_per')), + inProfit: createPerPattern(client, _m(acc, 'cost_basis_in_profit_per')), + max: createCentsSatsUsdPattern(client, _m(acc, 'cost_basis_max')), + min: createCentsSatsUsdPattern(client, _m(acc, 'cost_basis_min')), + perCoin: createPct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(client, _m(acc, 'cost_basis_per_coin')), + perDollar: createPct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(client, _m(acc, 'cost_basis_per_dollar')), + supplyDensity: createBpsPercentRatioPattern2(client, _m(acc, 'supply_density')), + }; +} + +/** + * @typedef {Object} MaxMedianMinPct10Pct25Pct75Pct90Pattern2 + * @property {SeriesPattern18} max + * @property {SeriesPattern18} median + * @property {SeriesPattern18} min + * @property {SeriesPattern18} pct10 + * @property {SeriesPattern18} pct25 + * @property {SeriesPattern18} pct75 + * @property {SeriesPattern18} pct90 + */ + +/** + * Create a MaxMedianMinPct10Pct25Pct75Pct90Pattern2 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {MaxMedianMinPct10Pct25Pct75Pct90Pattern2} + */ +function createMaxMedianMinPct10Pct25Pct75Pct90Pattern2(client, acc) { + return { + max: createSeriesPattern18(client, _m(acc, 'max')), + median: createSeriesPattern18(client, _m(acc, 'median')), + min: createSeriesPattern18(client, _m(acc, 'min')), + pct10: createSeriesPattern18(client, _m(acc, 'pct10')), + pct25: createSeriesPattern18(client, _m(acc, 'pct25')), + pct75: createSeriesPattern18(client, _m(acc, 'pct75')), + pct90: createSeriesPattern18(client, _m(acc, 'pct90')), + }; +} + +/** + * @template T + * @typedef {Object} MaxMedianMinPct10Pct25Pct75Pct90Pattern + * @property {SeriesPattern1} max + * @property {SeriesPattern1} median + * @property {SeriesPattern1} min + * @property {SeriesPattern1} pct10 + * @property {SeriesPattern1} pct25 + * @property {SeriesPattern1} pct75 + * @property {SeriesPattern1} pct90 + */ + +/** + * Create a MaxMedianMinPct10Pct25Pct75Pct90Pattern pattern node + * @template T + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {MaxMedianMinPct10Pct25Pct75Pct90Pattern} + */ +function createMaxMedianMinPct10Pct25Pct75Pct90Pattern(client, acc) { + return { + max: createSeriesPattern1(client, _m(acc, 'max')), + median: createSeriesPattern1(client, _m(acc, 'median')), + min: createSeriesPattern1(client, _m(acc, 'min')), + pct10: createSeriesPattern1(client, _m(acc, 'pct10')), + pct25: createSeriesPattern1(client, _m(acc, 'pct25')), + pct75: createSeriesPattern1(client, _m(acc, 'pct75')), + pct90: createSeriesPattern1(client, _m(acc, 'pct90')), + }; +} + +/** + * @typedef {Object} _1m1w1y2y4yAllPattern + * @property {BpsRatioPattern2} _1m + * @property {BpsRatioPattern2} _1w + * @property {BpsRatioPattern2} _1y + * @property {BpsRatioPattern2} _2y + * @property {BpsRatioPattern2} _4y + * @property {BpsRatioPattern2} all + */ + +/** + * Create a _1m1w1y2y4yAllPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {_1m1w1y2y4yAllPattern} + */ +function create_1m1w1y2y4yAllPattern(client, acc) { + return { + _1m: createBpsRatioPattern2(client, _m(acc, '1m')), + _1w: createBpsRatioPattern2(client, _m(acc, '1w')), + _1y: createBpsRatioPattern2(client, _m(acc, '1y')), + _2y: createBpsRatioPattern2(client, _m(acc, '2y')), + _4y: createBpsRatioPattern2(client, _m(acc, '4y')), + all: createBpsRatioPattern2(client, _m(acc, 'all')), + }; +} + +/** + * @typedef {Object} ActivityAddrOutputsRealizedSupplyUnrealizedPattern + * @property {TransferPattern} activity + * @property {BaseDeltaPattern} addrCount + * @property {SpendingSpentUnspentPattern} outputs + * @property {CapLossMvrvPriceProfitPattern} realized + * @property {DeltaDominanceTotalPattern} supply + * @property {NuplPattern} unrealized + */ + +/** + * Create a ActivityAddrOutputsRealizedSupplyUnrealizedPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} + */ +function createActivityAddrOutputsRealizedSupplyUnrealizedPattern(client, acc) { + return { + activity: createTransferPattern(client, _m(acc, 'transfer_volume')), + addrCount: createBaseDeltaPattern(client, _m(acc, 'addr_count')), + outputs: createSpendingSpentUnspentPattern(client, acc), + realized: createCapLossMvrvPriceProfitPattern(client, acc), + supply: createDeltaDominanceTotalPattern(client, _m(acc, 'supply')), + unrealized: createNuplPattern(client, _m(acc, 'nupl')), + }; +} + +/** + * @typedef {Object} AverageBlockCumulativeInSumPattern + * @property {_1m1w1y24hPattern3} average + * @property {BtcCentsSatsUsdPattern3} block + * @property {BtcCentsSatsUsdPattern} cumulative + * @property {AverageBlockCumulativeSumPattern3} inLoss + * @property {AverageBlockCumulativeSumPattern3} inProfit + * @property {_1m1w1y24hPattern4} sum + */ + +/** + * Create a AverageBlockCumulativeInSumPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {AverageBlockCumulativeInSumPattern} + */ +function createAverageBlockCumulativeInSumPattern(client, acc) { + return { + average: create_1m1w1y24hPattern3(client, _m(acc, 'average')), + block: createBtcCentsSatsUsdPattern3(client, acc), + cumulative: createBtcCentsSatsUsdPattern(client, _m(acc, 'cumulative')), + inLoss: createAverageBlockCumulativeSumPattern3(client, _m(acc, 'in_loss')), + inProfit: createAverageBlockCumulativeSumPattern3(client, _m(acc, 'in_profit')), + sum: create_1m1w1y24hPattern4(client, _m(acc, 'sum')), + }; +} + +/** + * @typedef {Object} BpsCentsPercentilesRatioSatsUsdPattern + * @property {SeriesPattern1} bps + * @property {SeriesPattern1} cents + * @property {Pct0Pct1Pct2Pct5Pct95Pct98Pct99Pattern} percentiles + * @property {SeriesPattern1} ratio + * @property {SeriesPattern1} sats + * @property {SeriesPattern1} usd + */ + +/** + * Create a BpsCentsPercentilesRatioSatsUsdPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {BpsCentsPercentilesRatioSatsUsdPattern} + */ +function createBpsCentsPercentilesRatioSatsUsdPattern(client, acc) { + return { + bps: createSeriesPattern1(client, _m(acc, 'ratio_bps')), + cents: createSeriesPattern1(client, _m(acc, 'cents')), + percentiles: createPct0Pct1Pct2Pct5Pct95Pct98Pct99Pattern(client, acc), + ratio: createSeriesPattern1(client, _m(acc, 'ratio')), + sats: createSeriesPattern1(client, _m(acc, 'sats')), + usd: createSeriesPattern1(client, acc), + }; +} + +/** + * @typedef {Object} CentsNegativeToUsdPattern2 + * @property {SeriesPattern1} cents + * @property {SeriesPattern1} negative + * @property {BpsPercentRatioPattern2} toMcap + * @property {BpsPercentRatioPattern2} toOwnGrossPnl + * @property {BpsPercentRatioPattern4} toOwnMcap + * @property {SeriesPattern1} usd + */ + +/** + * Create a CentsNegativeToUsdPattern2 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {CentsNegativeToUsdPattern2} + */ +function createCentsNegativeToUsdPattern2(client, acc) { + return { + cents: createSeriesPattern1(client, _m(acc, 'cents')), + negative: createSeriesPattern1(client, _m(acc, 'neg')), + toMcap: createBpsPercentRatioPattern2(client, _m(acc, 'to_mcap')), + toOwnGrossPnl: createBpsPercentRatioPattern2(client, _m(acc, 'to_own_gross_pnl')), + toOwnMcap: createBpsPercentRatioPattern4(client, _m(acc, 'to_own_mcap')), + usd: createSeriesPattern1(client, acc), + }; +} + +/** + * @typedef {Object} DeltaDominanceHalfInTotalPattern2 + * @property {AbsoluteRatePattern3} delta + * @property {BpsPercentRatioPattern2} dominance + * @property {BtcCentsSatsUsdPattern} half + * @property {BtcCentsSatsShareUsdPattern} inLoss + * @property {BtcCentsSatsShareUsdPattern} inProfit + * @property {BtcCentsSatsUsdPattern} total + */ + +/** + * Create a DeltaDominanceHalfInTotalPattern2 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {DeltaDominanceHalfInTotalPattern2} + */ +function createDeltaDominanceHalfInTotalPattern2(client, acc) { + return { + delta: createAbsoluteRatePattern3(client, _m(acc, 'delta')), + dominance: createBpsPercentRatioPattern2(client, _m(acc, 'dominance')), + half: createBtcCentsSatsUsdPattern(client, _m(acc, 'half')), + inLoss: createBtcCentsSatsShareUsdPattern(client, _m(acc, 'in_loss')), + inProfit: createBtcCentsSatsShareUsdPattern(client, _m(acc, 'in_profit')), + total: createBtcCentsSatsUsdPattern(client, acc), + }; +} + +/** + * @typedef {Object} DeltaDominanceHalfInTotalPattern + * @property {AbsoluteRatePattern3} delta + * @property {BpsPercentRatioPattern2} dominance + * @property {BtcCentsSatsUsdPattern} half + * @property {BtcCentsSatsUsdPattern} inLoss + * @property {BtcCentsSatsUsdPattern} inProfit + * @property {BtcCentsSatsUsdPattern} total + */ + +/** + * Create a DeltaDominanceHalfInTotalPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {DeltaDominanceHalfInTotalPattern} + */ +function createDeltaDominanceHalfInTotalPattern(client, acc) { + return { + delta: createAbsoluteRatePattern3(client, _m(acc, 'delta')), + dominance: createBpsPercentRatioPattern2(client, _m(acc, 'dominance')), + half: createBtcCentsSatsUsdPattern(client, _m(acc, 'half')), + inLoss: createBtcCentsSatsUsdPattern(client, _m(acc, 'in_loss')), + inProfit: createBtcCentsSatsUsdPattern(client, _m(acc, 'in_profit')), + total: createBtcCentsSatsUsdPattern(client, acc), + }; +} + +/** + * @typedef {Object} _1m1w1y24hBlockPattern2 + * @property {SeriesPattern1} _1m + * @property {SeriesPattern1} _1w + * @property {SeriesPattern1} _1y + * @property {SeriesPattern1} _24h + * @property {SeriesPattern18} block + */ + +/** + * Create a _1m1w1y24hBlockPattern2 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {_1m1w1y24hBlockPattern2} + */ +function create_1m1w1y24hBlockPattern2(client, acc) { + return { + _1m: createSeriesPattern1(client, _m(acc, 'average_1m')), + _1w: createSeriesPattern1(client, _m(acc, 'average_1w')), + _1y: createSeriesPattern1(client, _m(acc, 'average_1y')), + _24h: createSeriesPattern1(client, _m(acc, 'average_24h')), + block: createSeriesPattern18(client, acc), + }; +} + +/** + * @typedef {Object} _1m1w1y24hBlockPattern + * @property {SeriesPattern1} _1m + * @property {SeriesPattern1} _1w + * @property {SeriesPattern1} _1y + * @property {SeriesPattern1} _24h + * @property {SeriesPattern18} block + */ + +/** + * Create a _1m1w1y24hBlockPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {_1m1w1y24hBlockPattern} + */ +function create_1m1w1y24hBlockPattern(client, acc) { + return { + _1m: createSeriesPattern1(client, _m(acc, 'average_1m')), + _1w: createSeriesPattern1(client, _m(acc, 'average_1w')), + _1y: createSeriesPattern1(client, _m(acc, 'average_1y')), + _24h: createSeriesPattern1(client, _m(acc, 'average_24h')), + block: createSeriesPattern18(client, acc), + }; +} + +/** + * @typedef {Object} ActiveBidirectionalReactivatedReceivingSendingPattern + * @property {_1m1w1y24hBlockPattern} active + * @property {_1m1w1y24hBlockPattern} bidirectional + * @property {_1m1w1y24hBlockPattern} reactivated + * @property {_1m1w1y24hBlockPattern} receiving + * @property {_1m1w1y24hBlockPattern} sending + */ + +/** + * Create a ActiveBidirectionalReactivatedReceivingSendingPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {ActiveBidirectionalReactivatedReceivingSendingPattern} + */ +function createActiveBidirectionalReactivatedReceivingSendingPattern(client, acc) { + return { + active: create_1m1w1y24hBlockPattern(client, _m(acc, 'active_addrs')), + bidirectional: create_1m1w1y24hBlockPattern(client, _m(acc, 'bidirectional_addrs')), + reactivated: create_1m1w1y24hBlockPattern(client, _m(acc, 'reactivated_addrs')), + receiving: create_1m1w1y24hBlockPattern(client, _m(acc, 'receiving_addrs')), + sending: create_1m1w1y24hBlockPattern(client, _m(acc, 'sending_addrs')), + }; +} + +/** + * @typedef {Object} ActivityOutputsRealizedSupplyUnrealizedPattern + * @property {CoindaysTransferPattern} activity + * @property {SpendingSpentUnspentPattern} outputs + * @property {CapLossMvrvNetPriceProfitSoprPattern} realized + * @property {DeltaDominanceHalfInTotalPattern} supply + * @property {LossNetNuplProfitPattern} unrealized + */ + +/** + * Create a ActivityOutputsRealizedSupplyUnrealizedPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {ActivityOutputsRealizedSupplyUnrealizedPattern} + */ +function createActivityOutputsRealizedSupplyUnrealizedPattern(client, acc) { + return { + activity: createCoindaysTransferPattern(client, acc), + outputs: createSpendingSpentUnspentPattern(client, acc), + realized: createCapLossMvrvNetPriceProfitSoprPattern(client, acc), + supply: createDeltaDominanceHalfInTotalPattern(client, _m(acc, 'supply')), + unrealized: createLossNetNuplProfitPattern(client, acc), + }; +} + +/** + * @typedef {Object} ActivityOutputsRealizedSupplyUnrealizedPattern3 + * @property {TransferPattern} activity + * @property {SpendingSpentUnspentPattern} outputs + * @property {CapLossMvrvPriceProfitPattern} realized + * @property {DeltaDominanceHalfInTotalPattern} supply + * @property {LossNuplProfitPattern} unrealized + */ + +/** + * Create a ActivityOutputsRealizedSupplyUnrealizedPattern3 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {ActivityOutputsRealizedSupplyUnrealizedPattern3} + */ +function createActivityOutputsRealizedSupplyUnrealizedPattern3(client, acc) { + return { + activity: createTransferPattern(client, _m(acc, 'transfer_volume')), + outputs: createSpendingSpentUnspentPattern(client, acc), + realized: createCapLossMvrvPriceProfitPattern(client, acc), + supply: createDeltaDominanceHalfInTotalPattern(client, _m(acc, 'supply')), + unrealized: createLossNuplProfitPattern(client, acc), + }; +} + +/** + * @typedef {Object} ActivityOutputsRealizedSupplyUnrealizedPattern2 + * @property {TransferPattern} activity + * @property {SpendingSpentUnspentPattern} outputs + * @property {CapLossMvrvPriceProfitPattern} realized + * @property {DeltaDominanceTotalPattern} supply + * @property {NuplPattern} unrealized + */ + +/** + * Create a ActivityOutputsRealizedSupplyUnrealizedPattern2 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {ActivityOutputsRealizedSupplyUnrealizedPattern2} + */ +function createActivityOutputsRealizedSupplyUnrealizedPattern2(client, acc) { + return { + activity: createTransferPattern(client, _m(acc, 'transfer_volume')), + outputs: createSpendingSpentUnspentPattern(client, acc), + realized: createCapLossMvrvPriceProfitPattern(client, acc), + supply: createDeltaDominanceTotalPattern(client, _m(acc, 'supply')), + unrealized: createNuplPattern(client, _m(acc, 'nupl')), + }; +} + +/** + * @typedef {Object} BlockChangeCumulativeDeltaSumPattern + * @property {CentsUsdPattern4} block + * @property {ToPattern} change1m + * @property {CentsUsdPattern} cumulative + * @property {AbsoluteRatePattern2} delta + * @property {_1m1w1y24hPattern5} sum + */ + +/** + * Create a BlockChangeCumulativeDeltaSumPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {BlockChangeCumulativeDeltaSumPattern} + */ +function createBlockChangeCumulativeDeltaSumPattern(client, acc) { + return { + block: createCentsUsdPattern4(client, _m(acc, 'realized_pnl')), + change1m: createToPattern(client, _m(acc, 'pnl_change_1m_to')), + cumulative: createCentsUsdPattern(client, _m(acc, 'realized_pnl_cumulative')), + delta: createAbsoluteRatePattern2(client, _m(acc, 'realized_pnl_delta')), + sum: create_1m1w1y24hPattern5(client, _m(acc, 'realized_pnl_sum')), + }; +} + +/** + * @typedef {Object} BpsCentsRatioSatsUsdPattern + * @property {SeriesPattern1} bps + * @property {SeriesPattern1} cents + * @property {SeriesPattern1} ratio + * @property {SeriesPattern1} sats + * @property {SeriesPattern1} usd + */ + +/** + * Create a BpsCentsRatioSatsUsdPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {BpsCentsRatioSatsUsdPattern} + */ +function createBpsCentsRatioSatsUsdPattern(client, acc) { + return { + bps: createSeriesPattern1(client, _m(acc, 'ratio_bps')), + cents: createSeriesPattern1(client, _m(acc, 'cents')), + ratio: createSeriesPattern1(client, _m(acc, 'ratio')), + sats: createSeriesPattern1(client, _m(acc, 'sats')), + usd: createSeriesPattern1(client, acc), + }; +} + +/** + * @typedef {Object} BtcCentsDeltaSatsUsdPattern + * @property {SeriesPattern1} btc + * @property {SeriesPattern1} cents + * @property {AbsoluteRatePattern3} delta + * @property {SeriesPattern1} sats + * @property {SeriesPattern1} usd + */ + +/** + * Create a BtcCentsDeltaSatsUsdPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {BtcCentsDeltaSatsUsdPattern} + */ +function createBtcCentsDeltaSatsUsdPattern(client, acc) { + return { + btc: createSeriesPattern1(client, acc), + cents: createSeriesPattern1(client, _m(acc, 'cents')), + delta: createAbsoluteRatePattern3(client, _m(acc, 'delta')), + sats: createSeriesPattern1(client, _m(acc, 'sats')), + usd: createSeriesPattern1(client, _m(acc, 'usd')), + }; +} + +/** + * @typedef {Object} BtcCentsSatsShareUsdPattern + * @property {SeriesPattern1} btc + * @property {SeriesPattern1} cents + * @property {SeriesPattern1} sats + * @property {BpsPercentRatioPattern2} share + * @property {SeriesPattern1} usd + */ + +/** + * Create a BtcCentsSatsShareUsdPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {BtcCentsSatsShareUsdPattern} + */ +function createBtcCentsSatsShareUsdPattern(client, acc) { + return { + btc: createSeriesPattern1(client, acc), + cents: createSeriesPattern1(client, _m(acc, 'cents')), + sats: createSeriesPattern1(client, _m(acc, 'sats')), + share: createBpsPercentRatioPattern2(client, _m(acc, 'share')), + usd: createSeriesPattern1(client, _m(acc, 'usd')), + }; +} + +/** + * @typedef {Object} CapLossMvrvPriceProfitPattern + * @property {CentsDeltaUsdPattern} cap + * @property {BlockCumulativeSumPattern} loss + * @property {SeriesPattern1} mvrv + * @property {BpsCentsRatioSatsUsdPattern} price + * @property {BlockCumulativeSumPattern} profit + */ + +/** + * Create a CapLossMvrvPriceProfitPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {CapLossMvrvPriceProfitPattern} + */ +function createCapLossMvrvPriceProfitPattern(client, acc) { + return { + cap: createCentsDeltaUsdPattern(client, _m(acc, 'realized_cap')), + loss: createBlockCumulativeSumPattern(client, _m(acc, 'realized_loss')), + mvrv: createSeriesPattern1(client, _m(acc, 'mvrv')), + price: createBpsCentsRatioSatsUsdPattern(client, _m(acc, 'realized_price')), + profit: createBlockCumulativeSumPattern(client, _m(acc, 'realized_profit')), + }; +} + +/** + * @typedef {Object} CentsToUsdPattern4 + * @property {SeriesPattern1} cents + * @property {BpsPercentRatioPattern2} toMcap + * @property {BpsPercentRatioPattern2} toOwnGrossPnl + * @property {BpsPercentRatioPattern2} toOwnMcap + * @property {SeriesPattern1} usd + */ + +/** + * Create a CentsToUsdPattern4 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {CentsToUsdPattern4} + */ +function createCentsToUsdPattern4(client, acc) { + return { + cents: createSeriesPattern1(client, _m(acc, 'cents')), + toMcap: createBpsPercentRatioPattern2(client, _m(acc, 'to_mcap')), + toOwnGrossPnl: createBpsPercentRatioPattern2(client, _m(acc, 'to_own_gross_pnl')), + toOwnMcap: createBpsPercentRatioPattern2(client, _m(acc, 'to_own_mcap')), + usd: createSeriesPattern1(client, acc), + }; +} + +/** + * @typedef {Object} EmaHistogramLineSignalPattern + * @property {SeriesPattern1} emaFast + * @property {SeriesPattern1} emaSlow + * @property {SeriesPattern1} histogram + * @property {SeriesPattern1} line + * @property {SeriesPattern1} signal + */ + +/** + * @typedef {Object} PhsReboundThsPattern + * @property {SeriesPattern1} phs + * @property {SeriesPattern1} phsMin + * @property {BpsPercentRatioPattern} rebound + * @property {SeriesPattern1} ths + * @property {SeriesPattern1} thsMin + */ + +/** + * Create a PhsReboundThsPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {PhsReboundThsPattern} + */ +function createPhsReboundThsPattern(client, acc) { + return { + phs: createSeriesPattern1(client, _m(acc, 'phs')), + phsMin: createSeriesPattern1(client, _m(acc, 'phs_min')), + rebound: createBpsPercentRatioPattern(client, _m(acc, 'rebound')), + ths: createSeriesPattern1(client, _m(acc, 'ths')), + thsMin: createSeriesPattern1(client, _m(acc, 'ths_min')), + }; +} + +/** + * @typedef {Object} _1m1w1y24hPattern2 + * @property {BpsPercentRatioPattern} _1m + * @property {BpsPercentRatioPattern} _1w + * @property {BpsPercentRatioPattern} _1y + * @property {BpsPercentRatioPattern} _24h + */ + +/** + * Create a _1m1w1y24hPattern2 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {_1m1w1y24hPattern2} + */ +function create_1m1w1y24hPattern2(client, acc) { + return { + _1m: createBpsPercentRatioPattern(client, _m(acc, '1m_rate')), + _1w: createBpsPercentRatioPattern(client, _m(acc, '1w_rate')), + _1y: createBpsPercentRatioPattern(client, _m(acc, '1y_rate')), + _24h: createBpsPercentRatioPattern(client, _m(acc, '24h_rate')), + }; +} + +/** + * @typedef {Object} _1m1w1y24hPattern8 + * @property {BpsPercentRatioPattern4} _1m + * @property {BpsPercentRatioPattern4} _1w + * @property {BpsPercentRatioPattern4} _1y + * @property {BpsPercentRatioPattern4} _24h + */ + +/** + * Create a _1m1w1y24hPattern8 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {_1m1w1y24hPattern8} + */ +function create_1m1w1y24hPattern8(client, acc) { + return { + _1m: createBpsPercentRatioPattern4(client, _m(acc, '1m')), + _1w: createBpsPercentRatioPattern4(client, _m(acc, '1w')), + _1y: createBpsPercentRatioPattern4(client, _m(acc, '1y')), + _24h: createBpsPercentRatioPattern4(client, _m(acc, '24h')), + }; +} + +/** + * @typedef {Object} _1m1w1y24hPattern4 + * @property {BtcCentsSatsUsdPattern} _1m + * @property {BtcCentsSatsUsdPattern} _1w + * @property {BtcCentsSatsUsdPattern} _1y + * @property {BtcCentsSatsUsdPattern} _24h + */ + +/** + * Create a _1m1w1y24hPattern4 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {_1m1w1y24hPattern4} + */ +function create_1m1w1y24hPattern4(client, acc) { + return { + _1m: createBtcCentsSatsUsdPattern(client, _m(acc, '1m')), + _1w: createBtcCentsSatsUsdPattern(client, _m(acc, '1w')), + _1y: createBtcCentsSatsUsdPattern(client, _m(acc, '1y')), + _24h: createBtcCentsSatsUsdPattern(client, _m(acc, '24h')), + }; +} + +/** + * @typedef {Object} _1m1w1y24hPattern3 + * @property {BtcCentsSatsUsdPattern2} _1m + * @property {BtcCentsSatsUsdPattern2} _1w + * @property {BtcCentsSatsUsdPattern2} _1y + * @property {BtcCentsSatsUsdPattern2} _24h + */ + +/** + * Create a _1m1w1y24hPattern3 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {_1m1w1y24hPattern3} + */ +function create_1m1w1y24hPattern3(client, acc) { + return { + _1m: createBtcCentsSatsUsdPattern2(client, _m(acc, '1m')), + _1w: createBtcCentsSatsUsdPattern2(client, _m(acc, '1w')), + _1y: createBtcCentsSatsUsdPattern2(client, _m(acc, '1y')), + _24h: createBtcCentsSatsUsdPattern2(client, _m(acc, '24h')), + }; +} + +/** + * @typedef {Object} _1m1w1y24hPattern7 + * @property {BtcSatsPattern} _1m + * @property {BtcSatsPattern} _1w + * @property {BtcSatsPattern} _1y + * @property {BtcSatsPattern} _24h + */ + +/** + * Create a _1m1w1y24hPattern7 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {_1m1w1y24hPattern7} + */ +function create_1m1w1y24hPattern7(client, acc) { + return { + _1m: createBtcSatsPattern(client, _m(acc, '1m')), + _1w: createBtcSatsPattern(client, _m(acc, '1w')), + _1y: createBtcSatsPattern(client, _m(acc, '1y')), + _24h: createBtcSatsPattern(client, _m(acc, '24h')), + }; +} + +/** + * @typedef {Object} _1m1w1y2wPattern + * @property {CentsSatsUsdPattern} _1m + * @property {CentsSatsUsdPattern} _1w + * @property {CentsSatsUsdPattern} _1y + * @property {CentsSatsUsdPattern} _2w + */ + +/** + * Create a _1m1w1y2wPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {_1m1w1y2wPattern} + */ +function create_1m1w1y2wPattern(client, acc) { + return { + _1m: createCentsSatsUsdPattern(client, _m(acc, '1m')), + _1w: createCentsSatsUsdPattern(client, _m(acc, '1w')), + _1y: createCentsSatsUsdPattern(client, _m(acc, '1y')), + _2w: createCentsSatsUsdPattern(client, _m(acc, '2w')), + }; +} + +/** + * @typedef {Object} _1m1w1y24hPattern5 + * @property {CentsUsdPattern} _1m + * @property {CentsUsdPattern} _1w + * @property {CentsUsdPattern} _1y + * @property {CentsUsdPattern} _24h + */ + +/** + * Create a _1m1w1y24hPattern5 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {_1m1w1y24hPattern5} + */ +function create_1m1w1y24hPattern5(client, acc) { + return { + _1m: createCentsUsdPattern(client, _m(acc, '1m')), + _1w: createCentsUsdPattern(client, _m(acc, '1w')), + _1y: createCentsUsdPattern(client, _m(acc, '1y')), + _24h: createCentsUsdPattern(client, _m(acc, '24h')), + }; +} + +/** + * @typedef {Object} _1m1w1y24hPattern6 + * @property {CentsUsdPattern3} _1m + * @property {CentsUsdPattern3} _1w + * @property {CentsUsdPattern3} _1y + * @property {CentsUsdPattern3} _24h + */ + +/** + * Create a _1m1w1y24hPattern6 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {_1m1w1y24hPattern6} + */ +function create_1m1w1y24hPattern6(client, acc) { + return { + _1m: createCentsUsdPattern3(client, _m(acc, '1m')), + _1w: createCentsUsdPattern3(client, _m(acc, '1w')), + _1y: createCentsUsdPattern3(client, _m(acc, '1y')), + _24h: createCentsUsdPattern3(client, _m(acc, '24h')), + }; +} + +/** + * @typedef {Object} _1y2y4yAllPattern + * @property {_0sdM0M1M1sdM2M2sdM3sdP0P1P1sdP2P2sdP3sdSdZscorePattern} _1y + * @property {_0sdM0M1M1sdM2M2sdM3sdP0P1P1sdP2P2sdP3sdSdZscorePattern} _2y + * @property {_0sdM0M1M1sdM2M2sdM3sdP0P1P1sdP2P2sdP3sdSdZscorePattern} _4y + * @property {_0sdM0M1M1sdM2M2sdM3sdP0P1P1sdP2P2sdP3sdSdZscorePattern} all + */ + +/** + * @typedef {Object} AverageBlockCumulativeSumPattern2 + * @property {_1m1w1y24hPattern} average + * @property {SeriesPattern18} block + * @property {SeriesPattern1} cumulative + * @property {_1m1w1y24hPattern} sum + */ + +/** + * Create a AverageBlockCumulativeSumPattern2 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {AverageBlockCumulativeSumPattern2} + */ +function createAverageBlockCumulativeSumPattern2(client, acc) { + return { + average: create_1m1w1y24hPattern(client, _m(acc, 'average')), + block: createSeriesPattern18(client, acc), + cumulative: createSeriesPattern1(client, _m(acc, 'cumulative')), + sum: create_1m1w1y24hPattern(client, _m(acc, 'sum')), + }; +} + +/** + * @typedef {Object} AverageBlockCumulativeSumPattern3 + * @property {_1m1w1y24hPattern3} average + * @property {BtcCentsSatsUsdPattern3} block + * @property {BtcCentsSatsUsdPattern} cumulative + * @property {_1m1w1y24hPattern4} sum + */ + +/** + * Create a AverageBlockCumulativeSumPattern3 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {AverageBlockCumulativeSumPattern3} + */ +function createAverageBlockCumulativeSumPattern3(client, acc) { + return { + average: create_1m1w1y24hPattern3(client, _m(acc, 'average')), + block: createBtcCentsSatsUsdPattern3(client, acc), + cumulative: createBtcCentsSatsUsdPattern(client, _m(acc, 'cumulative')), + sum: create_1m1w1y24hPattern4(client, _m(acc, 'sum')), + }; +} + +/** + * @typedef {Object} BlockCumulativeNegativeSumPattern + * @property {CentsUsdPattern2} block + * @property {CentsUsdPattern3} cumulative + * @property {BaseSumPattern} negative + * @property {_1m1w1y24hPattern6} sum + */ + +/** + * Create a BlockCumulativeNegativeSumPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {BlockCumulativeNegativeSumPattern} + */ +function createBlockCumulativeNegativeSumPattern(client, acc) { + return { + block: createCentsUsdPattern2(client, acc), + cumulative: createCentsUsdPattern3(client, _m(acc, 'cumulative')), + negative: createBaseSumPattern(client, _m(acc, 'neg')), + sum: create_1m1w1y24hPattern6(client, _m(acc, 'sum')), + }; +} + +/** + * @typedef {Object} BlockCumulativeDeltaSumPattern + * @property {CentsUsdPattern4} block + * @property {CentsUsdPattern} cumulative + * @property {AbsoluteRatePattern2} delta + * @property {_1m1w1y24hPattern5} sum + */ + +/** + * Create a BlockCumulativeDeltaSumPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {BlockCumulativeDeltaSumPattern} + */ +function createBlockCumulativeDeltaSumPattern(client, acc) { + return { + block: createCentsUsdPattern4(client, acc), + cumulative: createCentsUsdPattern(client, _m(acc, 'cumulative')), + delta: createAbsoluteRatePattern2(client, _m(acc, 'delta')), + sum: create_1m1w1y24hPattern5(client, _m(acc, 'sum')), + }; +} + +/** + * @typedef {Object} BtcCentsSatsUsdPattern + * @property {SeriesPattern1} btc + * @property {SeriesPattern1} cents + * @property {SeriesPattern1} sats + * @property {SeriesPattern1} usd + */ + +/** + * Create a BtcCentsSatsUsdPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {BtcCentsSatsUsdPattern} + */ +function createBtcCentsSatsUsdPattern(client, acc) { + return { + btc: createSeriesPattern1(client, acc), + cents: createSeriesPattern1(client, _m(acc, 'cents')), + sats: createSeriesPattern1(client, _m(acc, 'sats')), + usd: createSeriesPattern1(client, _m(acc, 'usd')), + }; +} + +/** + * @typedef {Object} BtcCentsSatsUsdPattern2 + * @property {SeriesPattern1} btc + * @property {SeriesPattern1} cents + * @property {SeriesPattern1} sats + * @property {SeriesPattern1} usd + */ + +/** + * Create a BtcCentsSatsUsdPattern2 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {BtcCentsSatsUsdPattern2} + */ +function createBtcCentsSatsUsdPattern2(client, acc) { + return { + btc: createSeriesPattern1(client, acc), + cents: createSeriesPattern1(client, _m(acc, 'cents')), + sats: createSeriesPattern1(client, _m(acc, 'sats')), + usd: createSeriesPattern1(client, _m(acc, 'usd')), + }; +} + +/** + * @typedef {Object} BtcCentsSatsUsdPattern3 + * @property {SeriesPattern18} btc + * @property {SeriesPattern18} cents + * @property {SeriesPattern18} sats + * @property {SeriesPattern18} usd + */ + +/** + * Create a BtcCentsSatsUsdPattern3 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {BtcCentsSatsUsdPattern3} + */ +function createBtcCentsSatsUsdPattern3(client, acc) { + return { + btc: createSeriesPattern18(client, acc), + cents: createSeriesPattern18(client, _m(acc, 'cents')), + sats: createSeriesPattern18(client, _m(acc, 'sats')), + usd: createSeriesPattern18(client, _m(acc, 'usd')), + }; +} + +/** + * @typedef {Object} CentsDeltaToUsdPattern + * @property {SeriesPattern1} cents + * @property {AbsoluteRatePattern2} delta + * @property {BpsPercentRatioPattern4} toOwnMcap + * @property {SeriesPattern1} usd + */ + +/** + * Create a CentsDeltaToUsdPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {CentsDeltaToUsdPattern} + */ +function createCentsDeltaToUsdPattern(client, acc) { + return { + cents: createSeriesPattern1(client, _m(acc, 'cents')), + delta: createAbsoluteRatePattern2(client, _m(acc, 'delta')), + toOwnMcap: createBpsPercentRatioPattern4(client, _m(acc, 'to_own_mcap')), + usd: createSeriesPattern1(client, acc), + }; +} + +/** + * @typedef {Object} CentsToUsdPattern3 + * @property {SeriesPattern1} cents + * @property {BpsPercentRatioPattern} toOwnGrossPnl + * @property {BpsPercentRatioPattern} toOwnMcap + * @property {SeriesPattern1} usd + */ + +/** + * Create a CentsToUsdPattern3 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {CentsToUsdPattern3} + */ +function createCentsToUsdPattern3(client, acc) { + return { + cents: createSeriesPattern1(client, _m(acc, 'cents')), + toOwnGrossPnl: createBpsPercentRatioPattern(client, _m(acc, 'to_own_gross_pnl')), + toOwnMcap: createBpsPercentRatioPattern(client, _m(acc, 'to_own_mcap')), + usd: createSeriesPattern1(client, acc), + }; +} + +/** + * @typedef {Object} CoindaysCoinyearsDormancyTransferPattern + * @property {AverageBlockCumulativeSumPattern} coindaysDestroyed + * @property {SeriesPattern1} coinyearsDestroyed + * @property {_1m1w1y24hPattern} dormancy + * @property {AverageBlockCumulativeInSumPattern} transferVolume + */ + +/** + * Create a CoindaysCoinyearsDormancyTransferPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {CoindaysCoinyearsDormancyTransferPattern} + */ +function createCoindaysCoinyearsDormancyTransferPattern(client, acc) { + return { + coindaysDestroyed: createAverageBlockCumulativeSumPattern(client, _m(acc, 'coindays_destroyed')), + coinyearsDestroyed: createSeriesPattern1(client, _m(acc, 'coinyears_destroyed')), + dormancy: create_1m1w1y24hPattern(client, _m(acc, 'dormancy')), + transferVolume: createAverageBlockCumulativeInSumPattern(client, _m(acc, 'transfer_volume')), + }; +} + +/** + * @typedef {Object} LossNetNuplProfitPattern + * @property {CentsNegativeUsdPattern} loss + * @property {CentsUsdPattern} netPnl + * @property {BpsRatioPattern} nupl + * @property {CentsUsdPattern3} profit + */ + +/** + * Create a LossNetNuplProfitPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {LossNetNuplProfitPattern} + */ +function createLossNetNuplProfitPattern(client, acc) { + return { + loss: createCentsNegativeUsdPattern(client, _m(acc, 'unrealized_loss')), + netPnl: createCentsUsdPattern(client, _m(acc, 'net_unrealized_pnl')), + nupl: createBpsRatioPattern(client, _m(acc, 'nupl')), + profit: createCentsUsdPattern3(client, _m(acc, 'unrealized_profit')), + }; +} + +/** + * @typedef {Object} NuplRealizedSupplyUnrealizedPattern + * @property {BpsRatioPattern} nupl + * @property {AllSthPattern} realizedCap + * @property {AllSthPattern2} supply + * @property {AllSthPattern} unrealizedPnl + */ + +/** + * Create a NuplRealizedSupplyUnrealizedPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {NuplRealizedSupplyUnrealizedPattern} + */ +function createNuplRealizedSupplyUnrealizedPattern(client, acc) { + return { + nupl: createBpsRatioPattern(client, _m(acc, 'nupl')), + realizedCap: createAllSthPattern(client, acc, 'realized_cap'), + supply: createAllSthPattern2(client, acc), + unrealizedPnl: createAllSthPattern(client, acc, 'unrealized_pnl'), + }; +} + +/** + * @template T + * @typedef {Object} _1m1w1y24hPattern + * @property {SeriesPattern1} _1m + * @property {SeriesPattern1} _1w + * @property {SeriesPattern1} _1y + * @property {SeriesPattern1} _24h + */ + +/** + * Create a _1m1w1y24hPattern pattern node + * @template T + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {_1m1w1y24hPattern} + */ +function create_1m1w1y24hPattern(client, acc) { + return { + _1m: createSeriesPattern1(client, _m(acc, '1m')), + _1w: createSeriesPattern1(client, _m(acc, '1w')), + _1y: createSeriesPattern1(client, _m(acc, '1y')), + _24h: createSeriesPattern1(client, _m(acc, '24h')), + }; +} + +/** + * @template T + * @typedef {Object} AverageBlockCumulativeSumPattern + * @property {_1m1w1y24hPattern} average + * @property {SeriesPattern18} block + * @property {SeriesPattern1} cumulative + * @property {_1m1w1y24hPattern} sum + */ + +/** + * Create a AverageBlockCumulativeSumPattern pattern node + * @template T + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {AverageBlockCumulativeSumPattern} + */ +function createAverageBlockCumulativeSumPattern(client, acc) { + return { + average: create_1m1w1y24hPattern(client, _m(acc, 'average')), + block: createSeriesPattern18(client, acc), + cumulative: createSeriesPattern1(client, _m(acc, 'cumulative')), + sum: create_1m1w1y24hPattern(client, _m(acc, 'sum')), + }; +} + +/** + * @typedef {Object} AdjustedRatioValuePattern + * @property {RatioTransferValuePattern} adjusted + * @property {_1m1w1y24hPattern} ratio + * @property {AverageBlockCumulativeSumPattern} valueDestroyed + */ + +/** + * Create a AdjustedRatioValuePattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {AdjustedRatioValuePattern} + */ +function createAdjustedRatioValuePattern(client, acc) { + return { + adjusted: createRatioTransferValuePattern(client, acc), + ratio: create_1m1w1y24hPattern(client, _m(acc, 'sopr')), + valueDestroyed: createAverageBlockCumulativeSumPattern(client, _m(acc, 'value_destroyed')), + }; +} + +/** + * @typedef {Object} BlockCumulativeSumPattern + * @property {CentsUsdPattern2} block + * @property {CentsUsdPattern3} cumulative + * @property {_1m1w1y24hPattern6} sum + */ + +/** + * Create a BlockCumulativeSumPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {BlockCumulativeSumPattern} + */ +function createBlockCumulativeSumPattern(client, acc) { + return { + block: createCentsUsdPattern2(client, acc), + cumulative: createCentsUsdPattern3(client, _m(acc, 'cumulative')), + sum: create_1m1w1y24hPattern6(client, _m(acc, 'sum')), + }; +} + +/** + * @typedef {Object} BlocksDominanceRewardsPattern + * @property {AverageBlockCumulativeSumPattern2} blocksMined + * @property {_1m1w1y24hBpsPercentRatioPattern} dominance + * @property {AverageBlockCumulativeSumPattern3} rewards + */ + +/** + * Create a BlocksDominanceRewardsPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {BlocksDominanceRewardsPattern} + */ +function createBlocksDominanceRewardsPattern(client, acc) { + return { + blocksMined: createAverageBlockCumulativeSumPattern2(client, _m(acc, 'blocks_mined')), + dominance: create_1m1w1y24hBpsPercentRatioPattern(client, _m(acc, 'dominance')), + rewards: createAverageBlockCumulativeSumPattern3(client, _m(acc, 'rewards')), + }; +} + +/** + * @typedef {Object} BpsPercentRatioPattern2 + * @property {SeriesPattern1} bps + * @property {SeriesPattern1} percent + * @property {SeriesPattern1} ratio + */ + +/** + * Create a BpsPercentRatioPattern2 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {BpsPercentRatioPattern2} + */ +function createBpsPercentRatioPattern2(client, acc) { + return { + bps: createSeriesPattern1(client, _m(acc, 'bps')), + percent: createSeriesPattern1(client, acc), + ratio: createSeriesPattern1(client, _m(acc, 'ratio')), + }; +} + +/** + * @typedef {Object} BpsPercentRatioPattern4 + * @property {SeriesPattern1} bps + * @property {SeriesPattern1} percent + * @property {SeriesPattern1} ratio + */ + +/** + * Create a BpsPercentRatioPattern4 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {BpsPercentRatioPattern4} + */ +function createBpsPercentRatioPattern4(client, acc) { + return { + bps: createSeriesPattern1(client, _m(acc, 'bps')), + percent: createSeriesPattern1(client, acc), + ratio: createSeriesPattern1(client, _m(acc, 'ratio')), + }; +} + +/** + * @typedef {Object} BpsPriceRatioPattern + * @property {SeriesPattern1} bps + * @property {CentsSatsUsdPattern} price + * @property {SeriesPattern1} ratio + */ + +/** + * Create a BpsPriceRatioPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @param {string} disc - Discriminator suffix + * @returns {BpsPriceRatioPattern} + */ +function createBpsPriceRatioPattern(client, acc, disc) { + return { + bps: createSeriesPattern1(client, _m(acc, `ratio_${disc}_bps`)), + price: createCentsSatsUsdPattern(client, _m(acc, disc)), + ratio: createSeriesPattern1(client, _m(_m(acc, 'ratio'), disc)), + }; +} + +/** + * @typedef {Object} BpsPercentRatioPattern5 + * @property {SeriesPattern1} bps + * @property {SeriesPattern1} percent + * @property {SeriesPattern1} ratio + */ + +/** + * Create a BpsPercentRatioPattern5 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {BpsPercentRatioPattern5} + */ +function createBpsPercentRatioPattern5(client, acc) { + return { + bps: createSeriesPattern1(client, _m(acc, 'bps')), + percent: createSeriesPattern1(client, acc), + ratio: createSeriesPattern1(client, _m(acc, 'ratio')), + }; +} + +/** + * @typedef {Object} BpsPercentRatioPattern + * @property {SeriesPattern1} bps + * @property {SeriesPattern1} percent + * @property {SeriesPattern1} ratio + */ + +/** + * Create a BpsPercentRatioPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {BpsPercentRatioPattern} + */ +function createBpsPercentRatioPattern(client, acc) { + return { + bps: createSeriesPattern1(client, _m(acc, 'bps')), + percent: createSeriesPattern1(client, acc), + ratio: createSeriesPattern1(client, _m(acc, 'ratio')), + }; +} + +/** + * @typedef {Object} CentsSatsUsdPattern3 + * @property {SeriesPattern2} cents + * @property {SeriesPattern2} sats + * @property {SeriesPattern2} usd + */ + +/** + * Create a CentsSatsUsdPattern3 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {CentsSatsUsdPattern3} + */ +function createCentsSatsUsdPattern3(client, acc) { + return { + cents: createSeriesPattern2(client, _m(acc, 'cents')), + sats: createSeriesPattern2(client, _m(acc, 'sats')), + usd: createSeriesPattern2(client, acc), + }; +} + +/** + * @typedef {Object} CentsDeltaUsdPattern + * @property {SeriesPattern1} cents + * @property {AbsoluteRatePattern2} delta + * @property {SeriesPattern1} usd + */ + +/** + * Create a CentsDeltaUsdPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {CentsDeltaUsdPattern} + */ +function createCentsDeltaUsdPattern(client, acc) { + return { + cents: createSeriesPattern1(client, _m(acc, 'cents')), + delta: createAbsoluteRatePattern2(client, _m(acc, 'delta')), + usd: createSeriesPattern1(client, acc), + }; +} + +/** + * @typedef {Object} CentsNegativeUsdPattern + * @property {SeriesPattern1} cents + * @property {SeriesPattern1} negative + * @property {SeriesPattern1} usd + */ + +/** + * Create a CentsNegativeUsdPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {CentsNegativeUsdPattern} + */ +function createCentsNegativeUsdPattern(client, acc) { + return { + cents: createSeriesPattern1(client, _m(acc, 'cents')), + negative: createSeriesPattern1(client, _m(acc, 'neg')), + usd: createSeriesPattern1(client, acc), + }; +} + +/** + * @typedef {Object} CentsSatsUsdPattern + * @property {SeriesPattern1} cents + * @property {SeriesPattern1} sats + * @property {SeriesPattern1} usd + */ + +/** + * Create a CentsSatsUsdPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {CentsSatsUsdPattern} + */ +function createCentsSatsUsdPattern(client, acc) { + return { + cents: createSeriesPattern1(client, _m(acc, 'cents')), + sats: createSeriesPattern1(client, _m(acc, 'sats')), + usd: createSeriesPattern1(client, acc), + }; +} + +/** + * @typedef {Object} CountEventsSupplyPattern + * @property {FundedTotalPattern} count + * @property {ActiveInputOutputSpendablePattern} events + * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshSharePattern} supply + */ + +/** + * @typedef {Object} CumulativeRollingSumPattern + * @property {SeriesPattern1} cumulative + * @property {AverageMaxMedianMinPct10Pct25Pct75Pct90SumPattern} rolling + * @property {SeriesPattern18} sum + */ + +/** + * Create a CumulativeRollingSumPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {CumulativeRollingSumPattern} + */ +function createCumulativeRollingSumPattern(client, acc) { + return { + cumulative: createSeriesPattern1(client, _m(acc, 'cumulative')), + rolling: createAverageMaxMedianMinPct10Pct25Pct75Pct90SumPattern(client, acc), + sum: createSeriesPattern18(client, _m(acc, 'sum')), + }; +} + +/** + * @typedef {Object} DeltaDominanceTotalPattern + * @property {AbsoluteRatePattern3} delta + * @property {BpsPercentRatioPattern2} dominance + * @property {BtcCentsSatsUsdPattern} total + */ + +/** + * Create a DeltaDominanceTotalPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {DeltaDominanceTotalPattern} + */ +function createDeltaDominanceTotalPattern(client, acc) { + return { + delta: createAbsoluteRatePattern3(client, _m(acc, 'delta')), + dominance: createBpsPercentRatioPattern2(client, _m(acc, 'dominance')), + total: createBtcCentsSatsUsdPattern(client, acc), + }; +} + +/** + * @typedef {Object} GreedNetPainPattern + * @property {CentsUsdPattern3} greedIndex + * @property {CentsUsdPattern} net + * @property {CentsUsdPattern3} painIndex + */ + +/** + * Create a GreedNetPainPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {GreedNetPainPattern} + */ +function createGreedNetPainPattern(client, acc) { + return { + greedIndex: createCentsUsdPattern3(client, _m(acc, 'greed_index')), + net: createCentsUsdPattern(client, _m(acc, 'net_sentiment')), + painIndex: createCentsUsdPattern3(client, _m(acc, 'pain_index')), + }; +} + +/** + * @typedef {Object} LossNuplProfitPattern + * @property {CentsNegativeUsdPattern} loss + * @property {BpsRatioPattern} nupl + * @property {CentsUsdPattern3} profit + */ + +/** + * Create a LossNuplProfitPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {LossNuplProfitPattern} + */ +function createLossNuplProfitPattern(client, acc) { + return { + loss: createCentsNegativeUsdPattern(client, _m(acc, 'unrealized_loss')), + nupl: createBpsRatioPattern(client, _m(acc, 'nupl')), + profit: createCentsUsdPattern3(client, _m(acc, 'unrealized_profit')), + }; +} + +/** + * @typedef {Object} RatioTransferValuePattern + * @property {_1m1w1y24hPattern} ratio + * @property {AverageBlockCumulativeSumPattern} transferVolume + * @property {AverageBlockCumulativeSumPattern} valueDestroyed + */ + +/** + * Create a RatioTransferValuePattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {RatioTransferValuePattern} + */ +function createRatioTransferValuePattern(client, acc) { + return { + ratio: create_1m1w1y24hPattern(client, _m(acc, 'asopr')), + transferVolume: createAverageBlockCumulativeSumPattern(client, _m(acc, 'adj_value_created')), + valueDestroyed: createAverageBlockCumulativeSumPattern(client, _m(acc, 'adj_value_destroyed')), + }; +} + +/** + * @typedef {Object} RsiStochPattern + * @property {BpsPercentRatioPattern2} rsi + * @property {BpsPercentRatioPattern2} stochRsiD + * @property {BpsPercentRatioPattern2} stochRsiK + */ + +/** + * Create a RsiStochPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @param {string} disc - Discriminator suffix + * @returns {RsiStochPattern} + */ +function createRsiStochPattern(client, acc, disc) { + return { + rsi: createBpsPercentRatioPattern2(client, _m(acc, disc)), + stochRsiD: createBpsPercentRatioPattern2(client, _m(_m(acc, 'stoch_d'), disc)), + stochRsiK: createBpsPercentRatioPattern2(client, _m(_m(acc, 'stoch_k'), disc)), + }; +} + +/** + * @typedef {Object} SpendingSpentUnspentPattern + * @property {SeriesPattern1} spendingRate + * @property {AverageBlockCumulativeSumPattern2} spentCount + * @property {BaseDeltaPattern} unspentCount + */ + +/** + * Create a SpendingSpentUnspentPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {SpendingSpentUnspentPattern} + */ +function createSpendingSpentUnspentPattern(client, acc) { + return { + spendingRate: createSeriesPattern1(client, _m(acc, 'spending_rate')), + spentCount: createAverageBlockCumulativeSumPattern2(client, _m(acc, 'spent_utxo_count')), + unspentCount: createBaseDeltaPattern(client, _m(acc, 'utxo_count')), + }; +} + +/** + * @template T + * @typedef {Object} _6bBlockTxPattern + * @property {MaxMedianMinPct10Pct25Pct75Pct90Pattern} _6b + * @property {MaxMedianMinPct10Pct25Pct75Pct90Pattern} block + * @property {SeriesPattern19} txIndex + */ + +/** + * Create a _6bBlockTxPattern pattern node + * @template T + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {_6bBlockTxPattern} + */ +function create_6bBlockTxPattern(client, acc) { + return { + _6b: createMaxMedianMinPct10Pct25Pct75Pct90Pattern(client, _m(acc, '6b')), + block: createMaxMedianMinPct10Pct25Pct75Pct90Pattern(client, acc), + txIndex: createSeriesPattern19(client, acc), + }; +} + +/** + * @typedef {Object} AbsoluteRatePattern + * @property {_1m1w1y24hPattern} absolute + * @property {_1m1w1y24hPattern2} rate + */ + +/** + * Create a AbsoluteRatePattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {AbsoluteRatePattern} + */ +function createAbsoluteRatePattern(client, acc) { + return { + absolute: create_1m1w1y24hPattern(client, acc), + rate: create_1m1w1y24hPattern2(client, acc), + }; +} + +/** + * @typedef {Object} AbsoluteRatePattern2 + * @property {_1m1w1y24hPattern5} absolute + * @property {_1m1w1y24hPattern2} rate + */ + +/** + * Create a AbsoluteRatePattern2 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {AbsoluteRatePattern2} + */ +function createAbsoluteRatePattern2(client, acc) { + return { + absolute: create_1m1w1y24hPattern5(client, acc), + rate: create_1m1w1y24hPattern2(client, acc), + }; +} + +/** + * @typedef {Object} AbsoluteRatePattern3 + * @property {_1m1w1y24hPattern7} absolute + * @property {_1m1w1y24hPattern2} rate + */ + +/** + * Create a AbsoluteRatePattern3 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {AbsoluteRatePattern3} + */ +function createAbsoluteRatePattern3(client, acc) { + return { + absolute: create_1m1w1y24hPattern7(client, acc), + rate: create_1m1w1y24hPattern2(client, acc), + }; +} + +/** + * @typedef {Object} AddrUtxoPattern + * @property {BtcCentsSatsUsdPattern} addr + * @property {BtcCentsSatsUsdPattern} utxo + */ + +/** + * Create a AddrUtxoPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {AddrUtxoPattern} + */ +function createAddrUtxoPattern(client, acc) { + return { + addr: createBtcCentsSatsUsdPattern(client, _m(acc, 'addr_amount')), + utxo: createBtcCentsSatsUsdPattern(client, _m(acc, 'utxo_amount')), + }; +} + +/** + * @typedef {Object} AllSthPattern2 + * @property {BtcCentsDeltaSatsUsdPattern} all + * @property {BtcCentsSatsUsdPattern} sth + */ + +/** + * Create a AllSthPattern2 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {AllSthPattern2} + */ +function createAllSthPattern2(client, acc) { + return { + all: createBtcCentsDeltaSatsUsdPattern(client, _m(acc, 'supply')), + sth: createBtcCentsSatsUsdPattern(client, _m(acc, 'sth_supply')), + }; +} + +/** + * @typedef {Object} AllSthPattern + * @property {SeriesPattern1} all + * @property {SeriesPattern1} sth + */ + +/** + * Create a AllSthPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @param {string} disc - Discriminator suffix + * @returns {AllSthPattern} + */ +function createAllSthPattern(client, acc, disc) { + return { + all: createSeriesPattern1(client, _m(acc, disc)), + sth: createSeriesPattern1(client, _m(_m(acc, 'sth'), disc)), + }; +} + +/** + * @typedef {Object} BaseSumPattern + * @property {SeriesPattern18} base + * @property {_1m1w1y24hPattern} sum + */ + +/** + * Create a BaseSumPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {BaseSumPattern} + */ +function createBaseSumPattern(client, acc) { + return { + base: createSeriesPattern18(client, acc), + sum: create_1m1w1y24hPattern(client, _m(acc, 'sum')), + }; +} + +/** + * @typedef {Object} BaseDeltaPattern + * @property {SeriesPattern1} base + * @property {AbsoluteRatePattern} delta + */ + +/** + * Create a BaseDeltaPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {BaseDeltaPattern} + */ +function createBaseDeltaPattern(client, acc) { + return { + base: createSeriesPattern1(client, acc), + delta: createAbsoluteRatePattern(client, _m(acc, 'delta')), + }; +} + +/** + * @typedef {Object} BlockCumulativePattern + * @property {BtcCentsSatsUsdPattern3} block + * @property {BtcCentsSatsUsdPattern} cumulative + */ + +/** + * Create a BlockCumulativePattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {BlockCumulativePattern} + */ +function createBlockCumulativePattern(client, acc) { + return { + block: createBtcCentsSatsUsdPattern3(client, acc), + cumulative: createBtcCentsSatsUsdPattern(client, _m(acc, 'cumulative')), + }; +} + +/** + * @typedef {Object} BlocksDominancePattern + * @property {AverageBlockCumulativeSumPattern2} blocksMined + * @property {BpsPercentRatioPattern2} dominance + */ + +/** + * Create a BlocksDominancePattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {BlocksDominancePattern} + */ +function createBlocksDominancePattern(client, acc) { + return { + blocksMined: createAverageBlockCumulativeSumPattern2(client, _m(acc, 'blocks_mined')), + dominance: createBpsPercentRatioPattern2(client, _m(acc, 'dominance')), + }; +} + +/** + * @typedef {Object} BpsRatioPattern2 + * @property {SeriesPattern1} bps + * @property {SeriesPattern1} ratio + */ + +/** + * Create a BpsRatioPattern2 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {BpsRatioPattern2} + */ +function createBpsRatioPattern2(client, acc) { + return { + bps: createSeriesPattern1(client, _m(acc, 'bps')), + ratio: createSeriesPattern1(client, acc), + }; +} + +/** + * @typedef {Object} BpsRatioPattern + * @property {SeriesPattern1} bps + * @property {SeriesPattern1} ratio + */ + +/** + * Create a BpsRatioPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {BpsRatioPattern} + */ +function createBpsRatioPattern(client, acc) { + return { + bps: createSeriesPattern1(client, _m(acc, 'bps')), + ratio: createSeriesPattern1(client, acc), + }; +} + +/** + * @typedef {Object} BtcSatsPattern + * @property {SeriesPattern1} btc + * @property {SeriesPattern1} sats + */ + +/** + * Create a BtcSatsPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {BtcSatsPattern} + */ +function createBtcSatsPattern(client, acc) { + return { + btc: createSeriesPattern1(client, acc), + sats: createSeriesPattern1(client, _m(acc, 'sats')), + }; +} + +/** + * @typedef {Object} CentsUsdPattern3 + * @property {SeriesPattern1} cents + * @property {SeriesPattern1} usd + */ + +/** + * Create a CentsUsdPattern3 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {CentsUsdPattern3} + */ +function createCentsUsdPattern3(client, acc) { + return { + cents: createSeriesPattern1(client, _m(acc, 'cents')), + usd: createSeriesPattern1(client, acc), + }; +} + +/** + * @typedef {Object} CentsUsdPattern2 + * @property {SeriesPattern18} cents + * @property {SeriesPattern18} usd + */ + +/** + * Create a CentsUsdPattern2 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {CentsUsdPattern2} + */ +function createCentsUsdPattern2(client, acc) { + return { + cents: createSeriesPattern18(client, _m(acc, 'cents')), + usd: createSeriesPattern18(client, acc), + }; +} + +/** + * @typedef {Object} CentsUsdPattern + * @property {SeriesPattern1} cents + * @property {SeriesPattern1} usd + */ + +/** + * Create a CentsUsdPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {CentsUsdPattern} + */ +function createCentsUsdPattern(client, acc) { + return { + cents: createSeriesPattern1(client, _m(acc, 'cents')), + usd: createSeriesPattern1(client, acc), + }; +} + +/** + * @typedef {Object} CentsUsdPattern4 + * @property {SeriesPattern18} cents + * @property {SeriesPattern18} usd + */ + +/** + * Create a CentsUsdPattern4 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {CentsUsdPattern4} + */ +function createCentsUsdPattern4(client, acc) { + return { + cents: createSeriesPattern18(client, _m(acc, 'cents')), + usd: createSeriesPattern18(client, acc), + }; +} + +/** + * @typedef {Object} CoindaysTransferPattern + * @property {AverageBlockCumulativeSumPattern} coindaysDestroyed + * @property {AverageBlockCumulativeInSumPattern} transferVolume + */ + +/** + * Create a CoindaysTransferPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {CoindaysTransferPattern} + */ +function createCoindaysTransferPattern(client, acc) { + return { + coindaysDestroyed: createAverageBlockCumulativeSumPattern(client, _m(acc, 'coindays_destroyed')), + transferVolume: createAverageBlockCumulativeInSumPattern(client, _m(acc, 'transfer_volume')), + }; +} + +/** + * @typedef {Object} FundedTotalPattern + * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern4} funded + * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern4} total + */ + +/** + * Create a FundedTotalPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {FundedTotalPattern} + */ +function createFundedTotalPattern(client, acc) { + return { + funded: createAllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern4(client, acc), + total: createAllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern4(client, _p('total', acc)), + }; +} + +/** + * @typedef {Object} InPattern2 + * @property {CentsUsdPattern3} inLoss + * @property {CentsUsdPattern3} inProfit + */ + +/** + * Create a InPattern2 pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {InPattern2} + */ +function createInPattern2(client, acc) { + return { + inLoss: createCentsUsdPattern3(client, _m(acc, 'loss')), + inProfit: createCentsUsdPattern3(client, _m(acc, 'profit')), + }; +} + +/** + * @typedef {Object} InPattern + * @property {SharePattern} inLoss + * @property {SharePattern} inProfit + */ + +/** + * Create a InPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {InPattern} + */ +function createInPattern(client, acc) { + return { + inLoss: createSharePattern(client, _m(acc, 'loss_share')), + inProfit: createSharePattern(client, _m(acc, 'profit_share')), + }; +} + +/** + * @typedef {Object} PerPattern + * @property {CentsSatsUsdPattern} perCoin + * @property {CentsSatsUsdPattern} perDollar + */ + +/** + * Create a PerPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {PerPattern} + */ +function createPerPattern(client, acc) { + return { + perCoin: createCentsSatsUsdPattern(client, _m(acc, 'coin')), + perDollar: createCentsSatsUsdPattern(client, _m(acc, 'dollar')), + }; +} + +/** + * @typedef {Object} PriceRatioPattern + * @property {CentsSatsUsdPattern} price + * @property {SeriesPattern1} ratio + */ + +/** + * Create a PriceRatioPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @param {string} disc - Discriminator suffix + * @returns {PriceRatioPattern} + */ +function createPriceRatioPattern(client, acc, disc) { + return { + price: createCentsSatsUsdPattern(client, _m(acc, disc)), + ratio: createSeriesPattern1(client, _m(_m(acc, 'ratio'), disc)), + }; +} + +/** + * @typedef {Object} RatioValuePattern + * @property {_24hPattern} ratio + * @property {AverageBlockCumulativeSumPattern} valueDestroyed + */ + +/** + * Create a RatioValuePattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {RatioValuePattern} + */ +function createRatioValuePattern(client, acc) { + return { + ratio: create_24hPattern(client, _m(acc, 'sopr_24h')), + valueDestroyed: createAverageBlockCumulativeSumPattern(client, _m(acc, 'value_destroyed')), + }; +} + +/** + * @typedef {Object} SdSmaPattern + * @property {SeriesPattern1} sd + * @property {SeriesPattern1} sma + */ + +/** + * @typedef {Object} ToPattern + * @property {BpsPercentRatioPattern} toMcap + * @property {BpsPercentRatioPattern} toRcap + */ + +/** + * Create a ToPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {ToPattern} + */ +function createToPattern(client, acc) { + return { + toMcap: createBpsPercentRatioPattern(client, _m(acc, 'mcap')), + toRcap: createBpsPercentRatioPattern(client, _m(acc, 'rcap')), + }; +} + +/** + * @typedef {Object} _24hPattern + * @property {SeriesPattern1} _24h + */ + +/** + * Create a _24hPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {_24hPattern} + */ +function create_24hPattern(client, acc) { + return { + _24h: createSeriesPattern1(client, acc), + }; +} + +/** + * @typedef {Object} NuplPattern + * @property {BpsRatioPattern} nupl + */ + +/** + * Create a NuplPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {NuplPattern} + */ +function createNuplPattern(client, acc) { + return { + nupl: createBpsRatioPattern(client, acc), + }; +} + +/** + * @typedef {Object} PricePattern + * @property {BpsCentsPercentilesRatioSatsUsdPattern} price + */ + +/** + * Create a PricePattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {PricePattern} + */ +function createPricePattern(client, acc) { + return { + price: createBpsCentsPercentilesRatioSatsUsdPattern(client, acc), + }; +} + +/** + * @typedef {Object} SharePattern + * @property {BpsPercentRatioPattern2} share + */ + +/** + * Create a SharePattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {SharePattern} + */ +function createSharePattern(client, acc) { + return { + share: createBpsPercentRatioPattern2(client, acc), + }; +} + +/** + * @typedef {Object} TransferPattern + * @property {AverageBlockCumulativeSumPattern3} transferVolume + */ + +/** + * Create a TransferPattern pattern node + * @param {BrkClient} client + * @param {string} acc - Accumulated series name + * @returns {TransferPattern} + */ +function createTransferPattern(client, acc) { + return { + transferVolume: createAverageBlockCumulativeSumPattern3(client, acc), + }; +} + +// Catalog tree typedefs + +/** + * @typedef {Object} SeriesTree + * @property {SeriesTree_Blocks} blocks + * @property {SeriesTree_Transactions} transactions + * @property {SeriesTree_Inputs} inputs + * @property {SeriesTree_Outputs} outputs + * @property {SeriesTree_Addrs} addrs + * @property {SeriesTree_Scripts} scripts + * @property {SeriesTree_Mining} mining + * @property {SeriesTree_Cointime} cointime + * @property {SeriesTree_Constants} constants + * @property {SeriesTree_Indexes} indexes + * @property {SeriesTree_Indicators} indicators + * @property {SeriesTree_Investing} investing + * @property {SeriesTree_Market} market + * @property {SeriesTree_Pools} pools + * @property {SeriesTree_Prices} prices + * @property {SeriesTree_Supply} supply + * @property {SeriesTree_Cohorts} cohorts + */ + +/** + * @typedef {Object} SeriesTree_Blocks + * @property {SeriesPattern18} blockhash + * @property {SeriesPattern18} coinbaseTag + * @property {SeriesTree_Blocks_Difficulty} difficulty + * @property {SeriesTree_Blocks_Time} time + * @property {SeriesTree_Blocks_Size} size + * @property {AverageBaseCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern} weight + * @property {SeriesPattern18} segwitTxs + * @property {SeriesPattern18} segwitSize + * @property {SeriesPattern18} segwitWeight + * @property {SeriesTree_Blocks_Count} count + * @property {SeriesTree_Blocks_Lookback} lookback + * @property {SeriesTree_Blocks_Interval} interval + * @property {AverageBlockCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern} vbytes + * @property {SeriesTree_Blocks_Fullness} fullness + * @property {SeriesTree_Blocks_Halving} halving + */ + +/** + * @typedef {Object} SeriesTree_Blocks_Difficulty + * @property {SeriesPattern1} value + * @property {SeriesPattern1} hashrate + * @property {BpsPercentRatioPattern} adjustment + * @property {SeriesPattern1} epoch + * @property {SeriesPattern1} blocksToRetarget + * @property {SeriesPattern1} daysToRetarget + */ + +/** + * @typedef {Object} SeriesTree_Blocks_Time + * @property {SeriesPattern18} timestamp + */ + +/** + * @typedef {Object} SeriesTree_Blocks_Size + * @property {SeriesPattern18} base + * @property {SeriesPattern1} cumulative + * @property {_1m1w1y24hPattern} sum + * @property {_1m1w1y24hPattern} average + * @property {_1m1w1y24hPattern} min + * @property {_1m1w1y24hPattern} max + * @property {_1m1w1y24hPattern} pct10 + * @property {_1m1w1y24hPattern} pct25 + * @property {_1m1w1y24hPattern} median + * @property {_1m1w1y24hPattern} pct75 + * @property {_1m1w1y24hPattern} pct90 + */ + +/** + * @typedef {Object} SeriesTree_Blocks_Count + * @property {_1m1w1y24hPattern} target + * @property {AverageBlockCumulativeSumPattern2} total + */ + +/** + * @typedef {Object} SeriesTree_Blocks_Lookback + * @property {SeriesPattern18} _1h + * @property {SeriesPattern18} _24h + * @property {SeriesPattern18} _3d + * @property {SeriesPattern18} _1w + * @property {SeriesPattern18} _8d + * @property {SeriesPattern18} _9d + * @property {SeriesPattern18} _12d + * @property {SeriesPattern18} _13d + * @property {SeriesPattern18} _2w + * @property {SeriesPattern18} _21d + * @property {SeriesPattern18} _26d + * @property {SeriesPattern18} _1m + * @property {SeriesPattern18} _34d + * @property {SeriesPattern18} _55d + * @property {SeriesPattern18} _2m + * @property {SeriesPattern18} _9w + * @property {SeriesPattern18} _12w + * @property {SeriesPattern18} _89d + * @property {SeriesPattern18} _3m + * @property {SeriesPattern18} _14w + * @property {SeriesPattern18} _111d + * @property {SeriesPattern18} _144d + * @property {SeriesPattern18} _6m + * @property {SeriesPattern18} _26w + * @property {SeriesPattern18} _200d + * @property {SeriesPattern18} _9m + * @property {SeriesPattern18} _350d + * @property {SeriesPattern18} _12m + * @property {SeriesPattern18} _1y + * @property {SeriesPattern18} _14m + * @property {SeriesPattern18} _2y + * @property {SeriesPattern18} _26m + * @property {SeriesPattern18} _3y + * @property {SeriesPattern18} _200w + * @property {SeriesPattern18} _4y + * @property {SeriesPattern18} _5y + * @property {SeriesPattern18} _6y + * @property {SeriesPattern18} _8y + * @property {SeriesPattern18} _9y + * @property {SeriesPattern18} _10y + * @property {SeriesPattern18} _12y + * @property {SeriesPattern18} _14y + * @property {SeriesPattern18} _26y + */ + +/** + * @typedef {Object} SeriesTree_Blocks_Interval + * @property {SeriesPattern18} block + * @property {SeriesPattern1} _24h + * @property {SeriesPattern1} _1w + * @property {SeriesPattern1} _1m + * @property {SeriesPattern1} _1y + */ + +/** + * @typedef {Object} SeriesTree_Blocks_Fullness + * @property {SeriesPattern18} bps + * @property {SeriesPattern18} ratio + * @property {SeriesPattern18} percent + */ + +/** + * @typedef {Object} SeriesTree_Blocks_Halving + * @property {SeriesPattern1} epoch + * @property {SeriesPattern1} blocksToHalving + * @property {SeriesPattern1} daysToHalving + */ + +/** + * @typedef {Object} SeriesTree_Transactions + * @property {SeriesTree_Transactions_Raw} raw + * @property {SeriesTree_Transactions_Count} count + * @property {SeriesTree_Transactions_Size} size + * @property {SeriesTree_Transactions_Fees} fees + * @property {SeriesTree_Transactions_Versions} versions + * @property {SeriesTree_Transactions_Volume} volume + */ + +/** + * @typedef {Object} SeriesTree_Transactions_Raw + * @property {SeriesPattern18} firstTxIndex + * @property {SeriesPattern19} txid + * @property {SeriesPattern19} txVersion + * @property {SeriesPattern19} rawLocktime + * @property {SeriesPattern19} baseSize + * @property {SeriesPattern19} totalSize + * @property {SeriesPattern19} totalSigopCost + * @property {SeriesPattern19} isExplicitlyRbf + * @property {SeriesPattern19} firstTxinIndex + * @property {SeriesPattern19} firstTxoutIndex + */ + +/** + * @typedef {Object} SeriesTree_Transactions_Count + * @property {AverageBlockCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern} total + */ + +/** + * @typedef {Object} SeriesTree_Transactions_Size + * @property {_6bBlockTxPattern} vsize + * @property {SeriesTree_Transactions_Size_Weight} weight + */ + +/** + * @typedef {Object} SeriesTree_Transactions_Size_Weight + * @property {SeriesPattern19} txIndex + * @property {MaxMedianMinPct10Pct25Pct75Pct90Pattern2} block + * @property {MaxMedianMinPct10Pct25Pct75Pct90Pattern2} _6b + */ + +/** + * @typedef {Object} SeriesTree_Transactions_Fees + * @property {SeriesPattern19} inputValue + * @property {SeriesPattern19} outputValue + * @property {_6bBlockTxPattern} fee + * @property {SeriesPattern19} feeRate + * @property {_6bBlockTxPattern} effectiveFeeRate + */ + +/** + * @typedef {Object} SeriesTree_Transactions_Versions + * @property {AverageBlockCumulativeSumPattern} v1 + * @property {AverageBlockCumulativeSumPattern} v2 + * @property {AverageBlockCumulativeSumPattern} v3 + */ + +/** + * @typedef {Object} SeriesTree_Transactions_Volume + * @property {AverageBlockCumulativeSumPattern3} transferVolume + * @property {_1m1w1y24hPattern} txPerSec + */ + +/** + * @typedef {Object} SeriesTree_Inputs + * @property {SeriesTree_Inputs_Raw} raw + * @property {SeriesTree_Inputs_Spent} spent + * @property {CumulativeRollingSumPattern} count + * @property {_1m1w1y24hPattern} perSec + * @property {SeriesTree_Inputs_ByType} byType + */ + +/** + * @typedef {Object} SeriesTree_Inputs_Raw + * @property {SeriesPattern18} firstTxinIndex + * @property {SeriesPattern20} outpoint + * @property {SeriesPattern20} txIndex + * @property {SeriesPattern20} outputType + * @property {SeriesPattern20} typeIndex + */ + +/** + * @typedef {Object} SeriesTree_Inputs_Spent + * @property {SeriesPattern20} txoutIndex + * @property {SeriesPattern20} value + */ + +/** + * @typedef {Object} SeriesTree_Inputs_ByType + * @property {SeriesTree_Inputs_ByType_InputCount} inputCount + * @property {SeriesTree_Inputs_ByType_InputShare} inputShare + * @property {SeriesTree_Inputs_ByType_TxCount} txCount + * @property {EmptyP2aP2msP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshUnknownPattern2} txShare + */ + +/** + * @typedef {Object} SeriesTree_Inputs_ByType_InputCount + * @property {AverageBlockCumulativeSumPattern} all + * @property {AverageBlockCumulativeSumPattern} p2pk65 + * @property {AverageBlockCumulativeSumPattern} p2pk33 + * @property {AverageBlockCumulativeSumPattern} p2pkh + * @property {AverageBlockCumulativeSumPattern} p2ms + * @property {AverageBlockCumulativeSumPattern} p2sh + * @property {AverageBlockCumulativeSumPattern} p2wpkh + * @property {AverageBlockCumulativeSumPattern} p2wsh + * @property {AverageBlockCumulativeSumPattern} p2tr + * @property {AverageBlockCumulativeSumPattern} p2a + * @property {AverageBlockCumulativeSumPattern} unknown + * @property {AverageBlockCumulativeSumPattern} empty + */ + +/** + * @typedef {Object} SeriesTree_Inputs_ByType_InputShare + * @property {_1m1w1y24hBpsPercentRatioPattern} p2pk65 + * @property {_1m1w1y24hBpsPercentRatioPattern} p2pk33 + * @property {_1m1w1y24hBpsPercentRatioPattern} p2pkh + * @property {_1m1w1y24hBpsPercentRatioPattern} p2ms + * @property {_1m1w1y24hBpsPercentRatioPattern} p2sh + * @property {_1m1w1y24hBpsPercentRatioPattern} p2wpkh + * @property {_1m1w1y24hBpsPercentRatioPattern} p2wsh + * @property {_1m1w1y24hBpsPercentRatioPattern} p2tr + * @property {_1m1w1y24hBpsPercentRatioPattern} p2a + * @property {_1m1w1y24hBpsPercentRatioPattern} unknown + * @property {_1m1w1y24hBpsPercentRatioPattern} empty + */ + +/** + * @typedef {Object} SeriesTree_Inputs_ByType_TxCount + * @property {AverageBlockCumulativeSumPattern} all + * @property {AverageBlockCumulativeSumPattern} p2pk65 + * @property {AverageBlockCumulativeSumPattern} p2pk33 + * @property {AverageBlockCumulativeSumPattern} p2pkh + * @property {AverageBlockCumulativeSumPattern} p2ms + * @property {AverageBlockCumulativeSumPattern} p2sh + * @property {AverageBlockCumulativeSumPattern} p2wpkh + * @property {AverageBlockCumulativeSumPattern} p2wsh + * @property {AverageBlockCumulativeSumPattern} p2tr + * @property {AverageBlockCumulativeSumPattern} p2a + * @property {AverageBlockCumulativeSumPattern} unknown + * @property {AverageBlockCumulativeSumPattern} empty + */ + +/** + * @typedef {Object} SeriesTree_Outputs + * @property {SeriesTree_Outputs_Raw} raw + * @property {SeriesTree_Outputs_Spent} spent + * @property {SeriesTree_Outputs_Count} count + * @property {_1m1w1y24hPattern} perSec + * @property {SeriesTree_Outputs_Unspent} unspent + * @property {SeriesTree_Outputs_ByType} byType + * @property {SeriesTree_Outputs_Value} value + */ + +/** + * @typedef {Object} SeriesTree_Outputs_Raw + * @property {SeriesPattern18} firstTxoutIndex + * @property {SeriesPattern21} value + * @property {SeriesPattern21} outputType + * @property {SeriesPattern21} typeIndex + * @property {SeriesPattern21} txIndex + */ + +/** + * @typedef {Object} SeriesTree_Outputs_Spent + * @property {SeriesPattern21} txinIndex + */ + +/** + * @typedef {Object} SeriesTree_Outputs_Count + * @property {CumulativeRollingSumPattern} total + */ + +/** + * @typedef {Object} SeriesTree_Outputs_Unspent + * @property {SeriesPattern1} count + */ + +/** + * @typedef {Object} SeriesTree_Outputs_ByType + * @property {SeriesTree_Outputs_ByType_OutputCount} outputCount + * @property {AverageBlockCumulativeSumPattern} spendableOutputCount + * @property {SeriesTree_Outputs_ByType_OutputShare} outputShare + * @property {AllEmptyOpP2aP2msP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshUnknownPattern} txCount + * @property {EmptyOpP2aP2msP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshUnknownPattern2} txShare + */ + +/** + * @typedef {Object} SeriesTree_Outputs_ByType_OutputCount + * @property {AverageBlockCumulativeSumPattern} all + * @property {AverageBlockCumulativeSumPattern} p2pk65 + * @property {AverageBlockCumulativeSumPattern} p2pk33 + * @property {AverageBlockCumulativeSumPattern} p2pkh + * @property {AverageBlockCumulativeSumPattern} p2ms + * @property {AverageBlockCumulativeSumPattern} p2sh + * @property {AverageBlockCumulativeSumPattern} p2wpkh + * @property {AverageBlockCumulativeSumPattern} p2wsh + * @property {AverageBlockCumulativeSumPattern} p2tr + * @property {AverageBlockCumulativeSumPattern} p2a + * @property {AverageBlockCumulativeSumPattern} unknown + * @property {AverageBlockCumulativeSumPattern} empty + * @property {AverageBlockCumulativeSumPattern} opReturn + */ + +/** + * @typedef {Object} SeriesTree_Outputs_ByType_OutputShare + * @property {_1m1w1y24hBpsPercentRatioPattern} p2pk65 + * @property {_1m1w1y24hBpsPercentRatioPattern} p2pk33 + * @property {_1m1w1y24hBpsPercentRatioPattern} p2pkh + * @property {_1m1w1y24hBpsPercentRatioPattern} p2ms + * @property {_1m1w1y24hBpsPercentRatioPattern} p2sh + * @property {_1m1w1y24hBpsPercentRatioPattern} p2wpkh + * @property {_1m1w1y24hBpsPercentRatioPattern} p2wsh + * @property {_1m1w1y24hBpsPercentRatioPattern} p2tr + * @property {_1m1w1y24hBpsPercentRatioPattern} p2a + * @property {_1m1w1y24hBpsPercentRatioPattern} unknown + * @property {_1m1w1y24hBpsPercentRatioPattern} empty + * @property {_1m1w1y24hBpsPercentRatioPattern} opReturn + */ + +/** + * @typedef {Object} SeriesTree_Outputs_Value + * @property {BlockCumulativePattern} opReturn + */ + +/** + * @typedef {Object} SeriesTree_Addrs + * @property {SeriesTree_Addrs_Raw} raw + * @property {SeriesTree_Addrs_Indexes} indexes + * @property {SeriesTree_Addrs_Data} data + * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern4} funded + * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern4} empty + * @property {SeriesTree_Addrs_Activity} activity + * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern4} total + * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern6} new + * @property {SeriesTree_Addrs_Reused} reused + * @property {SeriesTree_Addrs_Respent} respent + * @property {SeriesTree_Addrs_Exposed} exposed + * @property {SeriesTree_Addrs_Delta} delta + * @property {SeriesTree_Addrs_AvgAmount} avgAmount + */ + +/** + * @typedef {Object} SeriesTree_Addrs_Raw + * @property {SeriesTree_Addrs_Raw_P2pk65} p2pk65 + * @property {SeriesTree_Addrs_Raw_P2pk33} p2pk33 + * @property {SeriesTree_Addrs_Raw_P2pkh} p2pkh + * @property {SeriesTree_Addrs_Raw_P2sh} p2sh + * @property {SeriesTree_Addrs_Raw_P2wpkh} p2wpkh + * @property {SeriesTree_Addrs_Raw_P2wsh} p2wsh + * @property {SeriesTree_Addrs_Raw_P2tr} p2tr + * @property {SeriesTree_Addrs_Raw_P2a} p2a + */ + +/** + * @typedef {Object} SeriesTree_Addrs_Raw_P2pk65 + * @property {SeriesPattern18} firstIndex + * @property {SeriesPattern27} bytes + */ + +/** + * @typedef {Object} SeriesTree_Addrs_Raw_P2pk33 + * @property {SeriesPattern18} firstIndex + * @property {SeriesPattern26} bytes + */ + +/** + * @typedef {Object} SeriesTree_Addrs_Raw_P2pkh + * @property {SeriesPattern18} firstIndex + * @property {SeriesPattern28} bytes + */ + +/** + * @typedef {Object} SeriesTree_Addrs_Raw_P2sh + * @property {SeriesPattern18} firstIndex + * @property {SeriesPattern29} bytes + */ + +/** + * @typedef {Object} SeriesTree_Addrs_Raw_P2wpkh + * @property {SeriesPattern18} firstIndex + * @property {SeriesPattern31} bytes + */ + +/** + * @typedef {Object} SeriesTree_Addrs_Raw_P2wsh + * @property {SeriesPattern18} firstIndex + * @property {SeriesPattern32} bytes + */ + +/** + * @typedef {Object} SeriesTree_Addrs_Raw_P2tr + * @property {SeriesPattern18} firstIndex + * @property {SeriesPattern30} bytes + */ + +/** + * @typedef {Object} SeriesTree_Addrs_Raw_P2a + * @property {SeriesPattern18} firstIndex + * @property {SeriesPattern24} bytes + */ + +/** + * @typedef {Object} SeriesTree_Addrs_Indexes + * @property {SeriesPattern24} p2a + * @property {SeriesPattern26} p2pk33 + * @property {SeriesPattern27} p2pk65 + * @property {SeriesPattern28} p2pkh + * @property {SeriesPattern29} p2sh + * @property {SeriesPattern30} p2tr + * @property {SeriesPattern31} p2wpkh + * @property {SeriesPattern32} p2wsh + * @property {SeriesPattern34} funded + * @property {SeriesPattern35} empty + */ + +/** + * @typedef {Object} SeriesTree_Addrs_Data + * @property {SeriesPattern34} funded + * @property {SeriesPattern35} empty + */ + +/** + * @typedef {Object} SeriesTree_Addrs_Activity + * @property {SeriesTree_Addrs_Activity_All} all + * @property {ActiveBidirectionalReactivatedReceivingSendingPattern} p2pk65 + * @property {ActiveBidirectionalReactivatedReceivingSendingPattern} p2pk33 + * @property {ActiveBidirectionalReactivatedReceivingSendingPattern} p2pkh + * @property {ActiveBidirectionalReactivatedReceivingSendingPattern} p2sh + * @property {ActiveBidirectionalReactivatedReceivingSendingPattern} p2wpkh + * @property {ActiveBidirectionalReactivatedReceivingSendingPattern} p2wsh + * @property {ActiveBidirectionalReactivatedReceivingSendingPattern} p2tr + * @property {ActiveBidirectionalReactivatedReceivingSendingPattern} p2a + */ + +/** + * @typedef {Object} SeriesTree_Addrs_Activity_All + * @property {_1m1w1y24hBlockPattern} reactivated + * @property {_1m1w1y24hBlockPattern} sending + * @property {_1m1w1y24hBlockPattern} receiving + * @property {_1m1w1y24hBlockPattern} bidirectional + * @property {_1m1w1y24hBlockPattern} active + */ + +/** + * @typedef {Object} SeriesTree_Addrs_Reused + * @property {FundedTotalPattern} count + * @property {SeriesTree_Addrs_Reused_Events} events + * @property {SeriesTree_Addrs_Reused_Supply} supply + */ + +/** + * @typedef {Object} SeriesTree_Addrs_Reused_Events + * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern6} outputToReusedAddrCount + * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern7} outputToReusedAddrShare + * @property {_1m1w1y24hBpsPercentRatioPattern} spendableOutputToReusedAddrShare + * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern6} inputFromReusedAddrCount + * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern7} inputFromReusedAddrShare + * @property {_1m1w1y24hBlockPattern} activeReusedAddrCount + * @property {_1m1w1y24hBlockPattern2} activeReusedAddrShare + */ + +/** + * @typedef {Object} SeriesTree_Addrs_Reused_Supply + * @property {BtcCentsSatsUsdPattern} all + * @property {BtcCentsSatsUsdPattern} p2pk65 + * @property {BtcCentsSatsUsdPattern} p2pk33 + * @property {BtcCentsSatsUsdPattern} p2pkh + * @property {BtcCentsSatsUsdPattern} p2sh + * @property {BtcCentsSatsUsdPattern} p2wpkh + * @property {BtcCentsSatsUsdPattern} p2wsh + * @property {BtcCentsSatsUsdPattern} p2tr + * @property {BtcCentsSatsUsdPattern} p2a + * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern5} share + */ + +/** + * @typedef {Object} SeriesTree_Addrs_Respent + * @property {FundedTotalPattern} count + * @property {SeriesTree_Addrs_Respent_Events} events + * @property {SeriesTree_Addrs_Respent_Supply} supply + */ + +/** + * @typedef {Object} SeriesTree_Addrs_Respent_Events + * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern6} outputToReusedAddrCount + * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern7} outputToReusedAddrShare + * @property {_1m1w1y24hBpsPercentRatioPattern} spendableOutputToReusedAddrShare + * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern6} inputFromReusedAddrCount + * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern7} inputFromReusedAddrShare + * @property {_1m1w1y24hBlockPattern} activeReusedAddrCount + * @property {_1m1w1y24hBlockPattern2} activeReusedAddrShare + */ + +/** + * @typedef {Object} SeriesTree_Addrs_Respent_Supply + * @property {BtcCentsSatsUsdPattern} all + * @property {BtcCentsSatsUsdPattern} p2pk65 + * @property {BtcCentsSatsUsdPattern} p2pk33 + * @property {BtcCentsSatsUsdPattern} p2pkh + * @property {BtcCentsSatsUsdPattern} p2sh + * @property {BtcCentsSatsUsdPattern} p2wpkh + * @property {BtcCentsSatsUsdPattern} p2wsh + * @property {BtcCentsSatsUsdPattern} p2tr + * @property {BtcCentsSatsUsdPattern} p2a + * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern5} share + */ + +/** + * @typedef {Object} SeriesTree_Addrs_Exposed + * @property {FundedTotalPattern} count + * @property {SeriesTree_Addrs_Exposed_Supply} supply + */ + +/** + * @typedef {Object} SeriesTree_Addrs_Exposed_Supply + * @property {BtcCentsSatsUsdPattern} all + * @property {BtcCentsSatsUsdPattern} p2pk65 + * @property {BtcCentsSatsUsdPattern} p2pk33 + * @property {BtcCentsSatsUsdPattern} p2pkh + * @property {BtcCentsSatsUsdPattern} p2sh + * @property {BtcCentsSatsUsdPattern} p2wpkh + * @property {BtcCentsSatsUsdPattern} p2wsh + * @property {BtcCentsSatsUsdPattern} p2tr + * @property {BtcCentsSatsUsdPattern} p2a + * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern5} share + */ + +/** + * @typedef {Object} SeriesTree_Addrs_Delta + * @property {AbsoluteRatePattern} all + * @property {AbsoluteRatePattern} p2pk65 + * @property {AbsoluteRatePattern} p2pk33 + * @property {AbsoluteRatePattern} p2pkh + * @property {AbsoluteRatePattern} p2sh + * @property {AbsoluteRatePattern} p2wpkh + * @property {AbsoluteRatePattern} p2wsh + * @property {AbsoluteRatePattern} p2tr + * @property {AbsoluteRatePattern} p2a + */ + +/** + * @typedef {Object} SeriesTree_Addrs_AvgAmount + * @property {AddrUtxoPattern} all + * @property {AddrUtxoPattern} p2pk65 + * @property {AddrUtxoPattern} p2pk33 + * @property {AddrUtxoPattern} p2pkh + * @property {AddrUtxoPattern} p2sh + * @property {AddrUtxoPattern} p2wpkh + * @property {AddrUtxoPattern} p2wsh + * @property {AddrUtxoPattern} p2tr + * @property {AddrUtxoPattern} p2a + */ + +/** + * @typedef {Object} SeriesTree_Scripts + * @property {SeriesTree_Scripts_Raw} raw + */ + +/** + * @typedef {Object} SeriesTree_Scripts_Raw + * @property {SeriesTree_Scripts_Raw_Empty} empty + * @property {SeriesTree_Scripts_Raw_OpReturn} opReturn + * @property {SeriesTree_Scripts_Raw_P2ms} p2ms + * @property {SeriesTree_Scripts_Raw_Unknown} unknown + */ + +/** + * @typedef {Object} SeriesTree_Scripts_Raw_Empty + * @property {SeriesPattern18} firstIndex + * @property {SeriesPattern22} toTxIndex + */ + +/** + * @typedef {Object} SeriesTree_Scripts_Raw_OpReturn + * @property {SeriesPattern18} firstIndex + * @property {SeriesPattern23} toTxIndex + */ + +/** + * @typedef {Object} SeriesTree_Scripts_Raw_P2ms + * @property {SeriesPattern18} firstIndex + * @property {SeriesPattern25} toTxIndex + */ + +/** + * @typedef {Object} SeriesTree_Scripts_Raw_Unknown + * @property {SeriesPattern18} firstIndex + * @property {SeriesPattern33} toTxIndex + */ + +/** + * @typedef {Object} SeriesTree_Mining + * @property {SeriesTree_Mining_Rewards} rewards + * @property {SeriesTree_Mining_Hashrate} hashrate + */ + +/** + * @typedef {Object} SeriesTree_Mining_Rewards + * @property {AverageBlockCumulativeSumPattern3} coinbase + * @property {SeriesTree_Mining_Rewards_Subsidy} subsidy + * @property {SeriesTree_Mining_Rewards_Fees} fees + * @property {SeriesPattern18} outputVolume + * @property {BlockCumulativePattern} unclaimed + */ + +/** + * @typedef {Object} SeriesTree_Mining_Rewards_Subsidy + * @property {BtcCentsSatsUsdPattern3} block + * @property {BtcCentsSatsUsdPattern} cumulative + * @property {_1m1w1y24hPattern4} sum + * @property {_1m1w1y24hPattern3} average + * @property {_1m1w1y24hBpsPercentRatioPattern} dominance + */ + +/** + * @typedef {Object} SeriesTree_Mining_Rewards_Fees + * @property {BtcCentsSatsUsdPattern3} block + * @property {BtcCentsSatsUsdPattern} cumulative + * @property {_1m1w1y24hPattern4} sum + * @property {_1m1w1y24hPattern3} average + * @property {_1m1w1y24hPattern4} min + * @property {_1m1w1y24hPattern4} max + * @property {_1m1w1y24hPattern4} pct10 + * @property {_1m1w1y24hPattern4} pct25 + * @property {_1m1w1y24hPattern4} median + * @property {_1m1w1y24hPattern4} pct75 + * @property {_1m1w1y24hPattern4} pct90 + * @property {_1m1w1y24hBpsPercentRatioPattern} dominance + * @property {SeriesTree_Mining_Rewards_Fees_ToSubsidyRatio} toSubsidyRatio + */ + +/** + * @typedef {Object} SeriesTree_Mining_Rewards_Fees_ToSubsidyRatio + * @property {BpsRatioPattern2} _24h + * @property {BpsRatioPattern2} _1w + * @property {BpsRatioPattern2} _1m + * @property {BpsRatioPattern2} _1y + */ + +/** + * @typedef {Object} SeriesTree_Mining_Hashrate + * @property {SeriesTree_Mining_Hashrate_Rate} rate + * @property {PhsReboundThsPattern} price + * @property {PhsReboundThsPattern} value + */ + +/** + * @typedef {Object} SeriesTree_Mining_Hashrate_Rate + * @property {SeriesPattern1} base + * @property {SeriesTree_Mining_Hashrate_Rate_Sma} sma + * @property {SeriesPattern1} ath + * @property {BpsPercentRatioPattern5} drawdown + */ + +/** + * @typedef {Object} SeriesTree_Mining_Hashrate_Rate_Sma + * @property {SeriesPattern1} _1w + * @property {SeriesPattern1} _1m + * @property {SeriesPattern1} _2m + * @property {SeriesPattern1} _1y + */ + +/** + * @typedef {Object} SeriesTree_Cointime + * @property {SeriesTree_Cointime_Activity} activity + * @property {SeriesTree_Cointime_Supply} supply + * @property {SeriesTree_Cointime_Value} value + * @property {SeriesTree_Cointime_Cap} cap + * @property {SeriesTree_Cointime_Prices} prices + * @property {SeriesTree_Cointime_Adjusted} adjusted + * @property {SeriesTree_Cointime_ReserveRisk} reserveRisk + */ + +/** + * @typedef {Object} SeriesTree_Cointime_Activity + * @property {AverageBlockCumulativeSumPattern} coinblocksCreated + * @property {AverageBlockCumulativeSumPattern} coinblocksStored + * @property {SeriesPattern1} liveliness + * @property {SeriesPattern1} vaultedness + * @property {SeriesPattern1} ratio + * @property {AverageBlockCumulativeSumPattern} coinblocksDestroyed + */ + +/** + * @typedef {Object} SeriesTree_Cointime_Supply + * @property {BtcCentsSatsUsdPattern} vaulted + * @property {BtcCentsSatsUsdPattern} active + */ + +/** + * @typedef {Object} SeriesTree_Cointime_Value + * @property {AverageBlockCumulativeSumPattern} destroyed + * @property {AverageBlockCumulativeSumPattern} created + * @property {AverageBlockCumulativeSumPattern} stored + * @property {AverageBlockCumulativeSumPattern} vocdd + */ + +/** + * @typedef {Object} SeriesTree_Cointime_Cap + * @property {CentsUsdPattern3} thermo + * @property {CentsUsdPattern3} investor + * @property {CentsUsdPattern3} vaulted + * @property {CentsUsdPattern3} active + * @property {CentsUsdPattern3} cointime + * @property {BpsRatioPattern2} aviv + */ + +/** + * @typedef {Object} SeriesTree_Cointime_Prices + * @property {BpsCentsPercentilesRatioSatsUsdPattern} vaulted + * @property {BpsCentsPercentilesRatioSatsUsdPattern} active + * @property {BpsCentsPercentilesRatioSatsUsdPattern} trueMarketMean + * @property {BpsCentsPercentilesRatioSatsUsdPattern} cointime + */ + +/** + * @typedef {Object} SeriesTree_Cointime_Adjusted + * @property {BpsPercentRatioPattern} inflationRate + * @property {SeriesPattern1} txVelocityNative + * @property {SeriesPattern1} txVelocityFiat + */ + +/** + * @typedef {Object} SeriesTree_Cointime_ReserveRisk + * @property {SeriesPattern1} value + * @property {SeriesPattern18} vocddMedian1y + * @property {SeriesPattern18} hodlBank + */ + +/** + * @typedef {Object} SeriesTree_Constants + * @property {SeriesPattern1} _0 + * @property {SeriesPattern1} _1 + * @property {SeriesPattern1} _2 + * @property {SeriesPattern1} _3 + * @property {SeriesPattern1} _4 + * @property {SeriesPattern1} _20 + * @property {SeriesPattern1} _30 + * @property {SeriesPattern1} _382 + * @property {SeriesPattern1} _50 + * @property {SeriesPattern1} _618 + * @property {SeriesPattern1} _70 + * @property {SeriesPattern1} _80 + * @property {SeriesPattern1} _100 + * @property {SeriesPattern1} _600 + * @property {SeriesPattern1} minus1 + * @property {SeriesPattern1} minus2 + * @property {SeriesPattern1} minus3 + * @property {SeriesPattern1} minus4 + */ + +/** + * @typedef {Object} SeriesTree_Indexes + * @property {SeriesTree_Indexes_Addr} addr + * @property {SeriesTree_Indexes_Height} height + * @property {SeriesTree_Indexes_Epoch} epoch + * @property {SeriesTree_Indexes_Halving} halving + * @property {SeriesTree_Indexes_Minute10} minute10 + * @property {SeriesTree_Indexes_Minute30} minute30 + * @property {SeriesTree_Indexes_Hour1} hour1 + * @property {SeriesTree_Indexes_Hour4} hour4 + * @property {SeriesTree_Indexes_Hour12} hour12 + * @property {SeriesTree_Indexes_Day1} day1 + * @property {SeriesTree_Indexes_Day3} day3 + * @property {SeriesTree_Indexes_Week1} week1 + * @property {SeriesTree_Indexes_Month1} month1 + * @property {SeriesTree_Indexes_Month3} month3 + * @property {SeriesTree_Indexes_Month6} month6 + * @property {SeriesTree_Indexes_Year1} year1 + * @property {SeriesTree_Indexes_Year10} year10 + * @property {SeriesTree_Indexes_TxIndex} txIndex + * @property {SeriesTree_Indexes_TxinIndex} txinIndex + * @property {SeriesTree_Indexes_TxoutIndex} txoutIndex + * @property {SeriesTree_Indexes_Timestamp} timestamp + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Addr + * @property {SeriesTree_Indexes_Addr_P2pk33} p2pk33 + * @property {SeriesTree_Indexes_Addr_P2pk65} p2pk65 + * @property {SeriesTree_Indexes_Addr_P2pkh} p2pkh + * @property {SeriesTree_Indexes_Addr_P2sh} p2sh + * @property {SeriesTree_Indexes_Addr_P2tr} p2tr + * @property {SeriesTree_Indexes_Addr_P2wpkh} p2wpkh + * @property {SeriesTree_Indexes_Addr_P2wsh} p2wsh + * @property {SeriesTree_Indexes_Addr_P2a} p2a + * @property {SeriesTree_Indexes_Addr_P2ms} p2ms + * @property {SeriesTree_Indexes_Addr_Empty} empty + * @property {SeriesTree_Indexes_Addr_Unknown} unknown + * @property {SeriesTree_Indexes_Addr_OpReturn} opReturn + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Addr_P2pk33 + * @property {SeriesPattern26} identity + * @property {SeriesPattern26} addr + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Addr_P2pk65 + * @property {SeriesPattern27} identity + * @property {SeriesPattern27} addr + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Addr_P2pkh + * @property {SeriesPattern28} identity + * @property {SeriesPattern28} addr + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Addr_P2sh + * @property {SeriesPattern29} identity + * @property {SeriesPattern29} addr + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Addr_P2tr + * @property {SeriesPattern30} identity + * @property {SeriesPattern30} addr + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Addr_P2wpkh + * @property {SeriesPattern31} identity + * @property {SeriesPattern31} addr + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Addr_P2wsh + * @property {SeriesPattern32} identity + * @property {SeriesPattern32} addr + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Addr_P2a + * @property {SeriesPattern24} identity + * @property {SeriesPattern24} addr + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Addr_P2ms + * @property {SeriesPattern25} identity + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Addr_Empty + * @property {SeriesPattern22} identity + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Addr_Unknown + * @property {SeriesPattern33} identity + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Addr_OpReturn + * @property {SeriesPattern23} identity + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Height + * @property {SeriesPattern18} minute10 + * @property {SeriesPattern18} minute30 + * @property {SeriesPattern18} hour1 + * @property {SeriesPattern18} hour4 + * @property {SeriesPattern18} hour12 + * @property {SeriesPattern18} day1 + * @property {SeriesPattern18} day3 + * @property {SeriesPattern18} epoch + * @property {SeriesPattern18} halving + * @property {SeriesPattern18} week1 + * @property {SeriesPattern18} month1 + * @property {SeriesPattern18} month3 + * @property {SeriesPattern18} month6 + * @property {SeriesPattern18} year1 + * @property {SeriesPattern18} year10 + * @property {SeriesPattern18} txIndexCount + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Epoch + * @property {SeriesPattern17} firstHeight + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Halving + * @property {SeriesPattern16} firstHeight + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Minute10 + * @property {SeriesPattern3} firstHeight + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Minute30 + * @property {SeriesPattern4} firstHeight + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Hour1 + * @property {SeriesPattern5} firstHeight + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Hour4 + * @property {SeriesPattern6} firstHeight + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Hour12 + * @property {SeriesPattern7} firstHeight + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Day1 + * @property {SeriesPattern8} date + * @property {SeriesPattern8} firstHeight + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Day3 + * @property {SeriesPattern9} date + * @property {SeriesPattern9} firstHeight + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Week1 + * @property {SeriesPattern10} date + * @property {SeriesPattern10} firstHeight + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Month1 + * @property {SeriesPattern11} date + * @property {SeriesPattern11} firstHeight + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Month3 + * @property {SeriesPattern12} date + * @property {SeriesPattern12} firstHeight + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Month6 + * @property {SeriesPattern13} date + * @property {SeriesPattern13} firstHeight + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Year1 + * @property {SeriesPattern14} date + * @property {SeriesPattern14} firstHeight + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Year10 + * @property {SeriesPattern15} date + * @property {SeriesPattern15} firstHeight + */ + +/** + * @typedef {Object} SeriesTree_Indexes_TxIndex + * @property {SeriesPattern19} identity + * @property {SeriesPattern19} inputCount + * @property {SeriesPattern19} outputCount + */ + +/** + * @typedef {Object} SeriesTree_Indexes_TxinIndex + * @property {SeriesPattern20} identity + */ + +/** + * @typedef {Object} SeriesTree_Indexes_TxoutIndex + * @property {SeriesPattern21} identity + */ + +/** + * @typedef {Object} SeriesTree_Indexes_Timestamp + * @property {SeriesPattern18} monotonic + * @property {SeriesPattern2} resolutions + */ + +/** + * @typedef {Object} SeriesTree_Indicators + * @property {BpsRatioPattern2} puellMultiple + * @property {BpsRatioPattern2} nvt + * @property {BpsPercentRatioPattern2} gini + * @property {BpsRatioPattern2} rhodlRatio + * @property {BpsRatioPattern2} thermoCapMultiple + * @property {SeriesPattern1} coindaysDestroyedSupplyAdj + * @property {SeriesPattern1} coinyearsDestroyedSupplyAdj + * @property {SeriesTree_Indicators_Dormancy} dormancy + * @property {SeriesPattern1} stockToFlow + * @property {SeriesPattern1} sellerExhaustion + * @property {SeriesTree_Indicators_RarityMeter} rarityMeter + */ + +/** + * @typedef {Object} SeriesTree_Indicators_Dormancy + * @property {SeriesPattern1} supplyAdj + * @property {SeriesPattern1} flow + */ + +/** + * @typedef {Object} SeriesTree_Indicators_RarityMeter + * @property {IndexPct0Pct1Pct2Pct5Pct95Pct98Pct99ScorePattern} full + * @property {IndexPct0Pct1Pct2Pct5Pct95Pct98Pct99ScorePattern} local + * @property {IndexPct0Pct1Pct2Pct5Pct95Pct98Pct99ScorePattern} cycle + */ + +/** + * @typedef {Object} SeriesTree_Investing + * @property {SeriesPattern18} satsPerDay + * @property {SeriesTree_Investing_Period} period + * @property {SeriesTree_Investing_Class} class + */ + +/** + * @typedef {Object} SeriesTree_Investing_Period + * @property {_10y1m1w1y2y3m3y4y5y6m6y8yPattern3} dcaStack + * @property {SeriesTree_Investing_Period_DcaCostBasis} dcaCostBasis + * @property {_10y1m1w1y2y3m3y4y5y6m6y8yPattern2} dcaReturn + * @property {_10y2y3y4y5y6y8yPattern} dcaCagr + * @property {_10y1m1w1y2y3m3y4y5y6m6y8yPattern3} lumpSumStack + * @property {_10y1m1w1y2y3m3y4y5y6m6y8yPattern2} lumpSumReturn + */ + +/** + * @typedef {Object} SeriesTree_Investing_Period_DcaCostBasis + * @property {CentsSatsUsdPattern} _1w + * @property {CentsSatsUsdPattern} _1m + * @property {CentsSatsUsdPattern} _3m + * @property {CentsSatsUsdPattern} _6m + * @property {CentsSatsUsdPattern} _1y + * @property {CentsSatsUsdPattern} _2y + * @property {CentsSatsUsdPattern} _3y + * @property {CentsSatsUsdPattern} _4y + * @property {CentsSatsUsdPattern} _5y + * @property {CentsSatsUsdPattern} _6y + * @property {CentsSatsUsdPattern} _8y + * @property {CentsSatsUsdPattern} _10y + */ + +/** + * @typedef {Object} SeriesTree_Investing_Class + * @property {SeriesTree_Investing_Class_DcaStack} dcaStack + * @property {SeriesTree_Investing_Class_DcaCostBasis} dcaCostBasis + * @property {SeriesTree_Investing_Class_DcaReturn} dcaReturn + */ + +/** + * @typedef {Object} SeriesTree_Investing_Class_DcaStack + * @property {BtcCentsSatsUsdPattern} from2015 + * @property {BtcCentsSatsUsdPattern} from2016 + * @property {BtcCentsSatsUsdPattern} from2017 + * @property {BtcCentsSatsUsdPattern} from2018 + * @property {BtcCentsSatsUsdPattern} from2019 + * @property {BtcCentsSatsUsdPattern} from2020 + * @property {BtcCentsSatsUsdPattern} from2021 + * @property {BtcCentsSatsUsdPattern} from2022 + * @property {BtcCentsSatsUsdPattern} from2023 + * @property {BtcCentsSatsUsdPattern} from2024 + * @property {BtcCentsSatsUsdPattern} from2025 + * @property {BtcCentsSatsUsdPattern} from2026 + */ + +/** + * @typedef {Object} SeriesTree_Investing_Class_DcaCostBasis + * @property {CentsSatsUsdPattern} from2015 + * @property {CentsSatsUsdPattern} from2016 + * @property {CentsSatsUsdPattern} from2017 + * @property {CentsSatsUsdPattern} from2018 + * @property {CentsSatsUsdPattern} from2019 + * @property {CentsSatsUsdPattern} from2020 + * @property {CentsSatsUsdPattern} from2021 + * @property {CentsSatsUsdPattern} from2022 + * @property {CentsSatsUsdPattern} from2023 + * @property {CentsSatsUsdPattern} from2024 + * @property {CentsSatsUsdPattern} from2025 + * @property {CentsSatsUsdPattern} from2026 + */ + +/** + * @typedef {Object} SeriesTree_Investing_Class_DcaReturn + * @property {BpsPercentRatioPattern} from2015 + * @property {BpsPercentRatioPattern} from2016 + * @property {BpsPercentRatioPattern} from2017 + * @property {BpsPercentRatioPattern} from2018 + * @property {BpsPercentRatioPattern} from2019 + * @property {BpsPercentRatioPattern} from2020 + * @property {BpsPercentRatioPattern} from2021 + * @property {BpsPercentRatioPattern} from2022 + * @property {BpsPercentRatioPattern} from2023 + * @property {BpsPercentRatioPattern} from2024 + * @property {BpsPercentRatioPattern} from2025 + * @property {BpsPercentRatioPattern} from2026 + */ + +/** + * @typedef {Object} SeriesTree_Market + * @property {SeriesTree_Market_Ath} ath + * @property {SeriesTree_Market_Lookback} lookback + * @property {SeriesTree_Market_Returns} returns + * @property {_1m1w1y24hPattern} volatility + * @property {SeriesTree_Market_Range} range + * @property {SeriesTree_Market_MovingAverage} movingAverage + * @property {SeriesTree_Market_Technical} technical + */ + +/** + * @typedef {Object} SeriesTree_Market_Ath + * @property {CentsSatsUsdPattern} high + * @property {BpsPercentRatioPattern5} drawdown + * @property {SeriesPattern1} daysSince + * @property {SeriesPattern1} yearsSince + * @property {SeriesPattern1} maxDaysBetween + * @property {SeriesPattern1} maxYearsBetween + */ + +/** + * @typedef {Object} SeriesTree_Market_Lookback + * @property {CentsSatsUsdPattern} _24h + * @property {CentsSatsUsdPattern} _1w + * @property {CentsSatsUsdPattern} _1m + * @property {CentsSatsUsdPattern} _3m + * @property {CentsSatsUsdPattern} _6m + * @property {CentsSatsUsdPattern} _1y + * @property {CentsSatsUsdPattern} _2y + * @property {CentsSatsUsdPattern} _3y + * @property {CentsSatsUsdPattern} _4y + * @property {CentsSatsUsdPattern} _5y + * @property {CentsSatsUsdPattern} _6y + * @property {CentsSatsUsdPattern} _8y + * @property {CentsSatsUsdPattern} _10y + */ + +/** + * @typedef {Object} SeriesTree_Market_Returns + * @property {SeriesTree_Market_Returns_Periods} periods + * @property {_10y2y3y4y5y6y8yPattern} cagr + * @property {SeriesTree_Market_Returns_Sd24h} sd24h + */ + +/** + * @typedef {Object} SeriesTree_Market_Returns_Periods + * @property {BpsPercentRatioPattern} _24h + * @property {BpsPercentRatioPattern} _1w + * @property {BpsPercentRatioPattern} _1m + * @property {BpsPercentRatioPattern} _3m + * @property {BpsPercentRatioPattern} _6m + * @property {BpsPercentRatioPattern} _1y + * @property {BpsPercentRatioPattern} _2y + * @property {BpsPercentRatioPattern} _3y + * @property {BpsPercentRatioPattern} _4y + * @property {BpsPercentRatioPattern} _5y + * @property {BpsPercentRatioPattern} _6y + * @property {BpsPercentRatioPattern} _8y + * @property {BpsPercentRatioPattern} _10y + */ + +/** + * @typedef {Object} SeriesTree_Market_Returns_Sd24h + * @property {SeriesTree_Market_Returns_Sd24h_24h} _24h + * @property {SeriesTree_Market_Returns_Sd24h_1w} _1w + * @property {SeriesTree_Market_Returns_Sd24h_1m} _1m + * @property {SeriesTree_Market_Returns_Sd24h_1y} _1y + */ + +/** + * @typedef {Object} SeriesTree_Market_Returns_Sd24h_24h + * @property {SeriesPattern1} sma + * @property {SeriesPattern1} sd + */ + +/** + * @typedef {Object} SeriesTree_Market_Returns_Sd24h_1w + * @property {SeriesPattern1} sma + * @property {SeriesPattern1} sd + */ + +/** + * @typedef {Object} SeriesTree_Market_Returns_Sd24h_1m + * @property {SeriesPattern1} sma + * @property {SeriesPattern1} sd + */ + +/** + * @typedef {Object} SeriesTree_Market_Returns_Sd24h_1y + * @property {SeriesPattern1} sma + * @property {SeriesPattern1} sd + */ + +/** + * @typedef {Object} SeriesTree_Market_Range + * @property {_1m1w1y2wPattern} min + * @property {_1m1w1y2wPattern} max + * @property {SeriesPattern1} trueRange + * @property {SeriesPattern1} trueRangeSum2w + * @property {BpsPercentRatioPattern2} choppinessIndex2w + */ + +/** + * @typedef {Object} SeriesTree_Market_MovingAverage + * @property {SeriesTree_Market_MovingAverage_Sma} sma + * @property {SeriesTree_Market_MovingAverage_Ema} ema + */ + +/** + * @typedef {Object} SeriesTree_Market_MovingAverage_Sma + * @property {BpsCentsRatioSatsUsdPattern} _1w + * @property {BpsCentsRatioSatsUsdPattern} _8d + * @property {BpsCentsRatioSatsUsdPattern} _13d + * @property {BpsCentsRatioSatsUsdPattern} _21d + * @property {BpsCentsRatioSatsUsdPattern} _1m + * @property {BpsCentsRatioSatsUsdPattern} _34d + * @property {BpsCentsRatioSatsUsdPattern} _55d + * @property {BpsCentsRatioSatsUsdPattern} _89d + * @property {BpsCentsRatioSatsUsdPattern} _111d + * @property {BpsCentsRatioSatsUsdPattern} _144d + * @property {SeriesTree_Market_MovingAverage_Sma_200d} _200d + * @property {SeriesTree_Market_MovingAverage_Sma_350d} _350d + * @property {BpsCentsRatioSatsUsdPattern} _1y + * @property {BpsCentsRatioSatsUsdPattern} _2y + * @property {BpsCentsRatioSatsUsdPattern} _200w + * @property {BpsCentsRatioSatsUsdPattern} _4y + */ + +/** + * @typedef {Object} SeriesTree_Market_MovingAverage_Sma_200d + * @property {SeriesPattern1} usd + * @property {SeriesPattern1} cents + * @property {SeriesPattern1} sats + * @property {SeriesPattern1} bps + * @property {SeriesPattern1} ratio + * @property {CentsSatsUsdPattern} x24 + * @property {CentsSatsUsdPattern} x08 + */ + +/** + * @typedef {Object} SeriesTree_Market_MovingAverage_Sma_350d + * @property {SeriesPattern1} usd + * @property {SeriesPattern1} cents + * @property {SeriesPattern1} sats + * @property {SeriesPattern1} bps + * @property {SeriesPattern1} ratio + * @property {CentsSatsUsdPattern} x2 + */ + +/** + * @typedef {Object} SeriesTree_Market_MovingAverage_Ema + * @property {BpsCentsRatioSatsUsdPattern} _1w + * @property {BpsCentsRatioSatsUsdPattern} _8d + * @property {BpsCentsRatioSatsUsdPattern} _12d + * @property {BpsCentsRatioSatsUsdPattern} _13d + * @property {BpsCentsRatioSatsUsdPattern} _21d + * @property {BpsCentsRatioSatsUsdPattern} _26d + * @property {BpsCentsRatioSatsUsdPattern} _1m + * @property {BpsCentsRatioSatsUsdPattern} _34d + * @property {BpsCentsRatioSatsUsdPattern} _55d + * @property {BpsCentsRatioSatsUsdPattern} _89d + * @property {BpsCentsRatioSatsUsdPattern} _144d + * @property {BpsCentsRatioSatsUsdPattern} _200d + * @property {BpsCentsRatioSatsUsdPattern} _1y + * @property {BpsCentsRatioSatsUsdPattern} _2y + * @property {BpsCentsRatioSatsUsdPattern} _200w + * @property {BpsCentsRatioSatsUsdPattern} _4y + */ + +/** + * @typedef {Object} SeriesTree_Market_Technical + * @property {SeriesTree_Market_Technical_Rsi} rsi + * @property {BpsRatioPattern2} piCycle + * @property {SeriesTree_Market_Technical_Macd} macd + */ + +/** + * @typedef {Object} SeriesTree_Market_Technical_Rsi + * @property {RsiStochPattern} _24h + * @property {RsiStochPattern} _1w + * @property {RsiStochPattern} _1m + */ + +/** + * @typedef {Object} SeriesTree_Market_Technical_Macd + * @property {SeriesTree_Market_Technical_Macd_24h} _24h + * @property {SeriesTree_Market_Technical_Macd_1w} _1w + * @property {SeriesTree_Market_Technical_Macd_1m} _1m + */ + +/** + * @typedef {Object} SeriesTree_Market_Technical_Macd_24h + * @property {SeriesPattern1} emaFast + * @property {SeriesPattern1} emaSlow + * @property {SeriesPattern1} line + * @property {SeriesPattern1} signal + * @property {SeriesPattern1} histogram + */ + +/** + * @typedef {Object} SeriesTree_Market_Technical_Macd_1w + * @property {SeriesPattern1} emaFast + * @property {SeriesPattern1} emaSlow + * @property {SeriesPattern1} line + * @property {SeriesPattern1} signal + * @property {SeriesPattern1} histogram + */ + +/** + * @typedef {Object} SeriesTree_Market_Technical_Macd_1m + * @property {SeriesPattern1} emaFast + * @property {SeriesPattern1} emaSlow + * @property {SeriesPattern1} line + * @property {SeriesPattern1} signal + * @property {SeriesPattern1} histogram + */ + +/** + * @typedef {Object} SeriesTree_Pools + * @property {SeriesPattern18} pool + * @property {SeriesTree_Pools_Major} major + * @property {SeriesTree_Pools_Minor} minor + */ + +/** + * @typedef {Object} SeriesTree_Pools_Major + * @property {BlocksDominanceRewardsPattern} unknown + * @property {BlocksDominanceRewardsPattern} luxor + * @property {BlocksDominanceRewardsPattern} btccom + * @property {BlocksDominanceRewardsPattern} btctop + * @property {BlocksDominanceRewardsPattern} btcguild + * @property {BlocksDominanceRewardsPattern} eligius + * @property {BlocksDominanceRewardsPattern} f2pool + * @property {BlocksDominanceRewardsPattern} braiinspool + * @property {BlocksDominanceRewardsPattern} antpool + * @property {BlocksDominanceRewardsPattern} btcc + * @property {BlocksDominanceRewardsPattern} bwpool + * @property {BlocksDominanceRewardsPattern} bitfury + * @property {BlocksDominanceRewardsPattern} viabtc + * @property {BlocksDominanceRewardsPattern} poolin + * @property {BlocksDominanceRewardsPattern} spiderpool + * @property {BlocksDominanceRewardsPattern} binancepool + * @property {BlocksDominanceRewardsPattern} foundryusa + * @property {BlocksDominanceRewardsPattern} sbicrypto + * @property {BlocksDominanceRewardsPattern} marapool + * @property {BlocksDominanceRewardsPattern} secpool + * @property {BlocksDominanceRewardsPattern} ocean + * @property {BlocksDominanceRewardsPattern} whitepool + */ + +/** + * @typedef {Object} SeriesTree_Pools_Minor + * @property {BlocksDominancePattern} blockfills + * @property {BlocksDominancePattern} ultimuspool + * @property {BlocksDominancePattern} terrapool + * @property {BlocksDominancePattern} onethash + * @property {BlocksDominancePattern} bitfarms + * @property {BlocksDominancePattern} huobipool + * @property {BlocksDominancePattern} wayicn + * @property {BlocksDominancePattern} canoepool + * @property {BlocksDominancePattern} bitcoincom + * @property {BlocksDominancePattern} pool175btc + * @property {BlocksDominancePattern} gbminers + * @property {BlocksDominancePattern} axbt + * @property {BlocksDominancePattern} asicminer + * @property {BlocksDominancePattern} bitminter + * @property {BlocksDominancePattern} bitcoinrussia + * @property {BlocksDominancePattern} btcserv + * @property {BlocksDominancePattern} simplecoinus + * @property {BlocksDominancePattern} ozcoin + * @property {BlocksDominancePattern} eclipsemc + * @property {BlocksDominancePattern} maxbtc + * @property {BlocksDominancePattern} triplemining + * @property {BlocksDominancePattern} coinlab + * @property {BlocksDominancePattern} pool50btc + * @property {BlocksDominancePattern} ghashio + * @property {BlocksDominancePattern} stminingcorp + * @property {BlocksDominancePattern} bitparking + * @property {BlocksDominancePattern} mmpool + * @property {BlocksDominancePattern} polmine + * @property {BlocksDominancePattern} kncminer + * @property {BlocksDominancePattern} bitalo + * @property {BlocksDominancePattern} hhtt + * @property {BlocksDominancePattern} megabigpower + * @property {BlocksDominancePattern} mtred + * @property {BlocksDominancePattern} nmcbit + * @property {BlocksDominancePattern} yourbtcnet + * @property {BlocksDominancePattern} givemecoins + * @property {BlocksDominancePattern} multicoinco + * @property {BlocksDominancePattern} bcpoolio + * @property {BlocksDominancePattern} cointerra + * @property {BlocksDominancePattern} kanopool + * @property {BlocksDominancePattern} solock + * @property {BlocksDominancePattern} ckpool + * @property {BlocksDominancePattern} nicehash + * @property {BlocksDominancePattern} bitclub + * @property {BlocksDominancePattern} bitcoinaffiliatenetwork + * @property {BlocksDominancePattern} exxbw + * @property {BlocksDominancePattern} bitsolo + * @property {BlocksDominancePattern} twentyoneinc + * @property {BlocksDominancePattern} digitalbtc + * @property {BlocksDominancePattern} eightbaochi + * @property {BlocksDominancePattern} mybtccoinpool + * @property {BlocksDominancePattern} tbdice + * @property {BlocksDominancePattern} hashpool + * @property {BlocksDominancePattern} nexious + * @property {BlocksDominancePattern} bravomining + * @property {BlocksDominancePattern} hotpool + * @property {BlocksDominancePattern} okexpool + * @property {BlocksDominancePattern} bcmonster + * @property {BlocksDominancePattern} onehash + * @property {BlocksDominancePattern} bixin + * @property {BlocksDominancePattern} tatmaspool + * @property {BlocksDominancePattern} connectbtc + * @property {BlocksDominancePattern} batpool + * @property {BlocksDominancePattern} waterhole + * @property {BlocksDominancePattern} dcexploration + * @property {BlocksDominancePattern} dcex + * @property {BlocksDominancePattern} btpool + * @property {BlocksDominancePattern} fiftyeightcoin + * @property {BlocksDominancePattern} bitcoinindia + * @property {BlocksDominancePattern} shawnp0wers + * @property {BlocksDominancePattern} phashio + * @property {BlocksDominancePattern} rigpool + * @property {BlocksDominancePattern} haozhuzhu + * @property {BlocksDominancePattern} sevenpool + * @property {BlocksDominancePattern} miningkings + * @property {BlocksDominancePattern} hashbx + * @property {BlocksDominancePattern} dpool + * @property {BlocksDominancePattern} rawpool + * @property {BlocksDominancePattern} haominer + * @property {BlocksDominancePattern} helix + * @property {BlocksDominancePattern} bitcoinukraine + * @property {BlocksDominancePattern} secretsuperstar + * @property {BlocksDominancePattern} tigerpoolnet + * @property {BlocksDominancePattern} sigmapoolcom + * @property {BlocksDominancePattern} okpooltop + * @property {BlocksDominancePattern} hummerpool + * @property {BlocksDominancePattern} tangpool + * @property {BlocksDominancePattern} bytepool + * @property {BlocksDominancePattern} novablock + * @property {BlocksDominancePattern} miningcity + * @property {BlocksDominancePattern} minerium + * @property {BlocksDominancePattern} lubiancom + * @property {BlocksDominancePattern} okkong + * @property {BlocksDominancePattern} aaopool + * @property {BlocksDominancePattern} emcdpool + * @property {BlocksDominancePattern} arkpool + * @property {BlocksDominancePattern} purebtccom + * @property {BlocksDominancePattern} kucoinpool + * @property {BlocksDominancePattern} entrustcharitypool + * @property {BlocksDominancePattern} okminer + * @property {BlocksDominancePattern} titan + * @property {BlocksDominancePattern} pegapool + * @property {BlocksDominancePattern} btcnuggets + * @property {BlocksDominancePattern} cloudhashing + * @property {BlocksDominancePattern} digitalxmintsy + * @property {BlocksDominancePattern} telco214 + * @property {BlocksDominancePattern} btcpoolparty + * @property {BlocksDominancePattern} multipool + * @property {BlocksDominancePattern} transactioncoinmining + * @property {BlocksDominancePattern} btcdig + * @property {BlocksDominancePattern} trickysbtcpool + * @property {BlocksDominancePattern} btcmp + * @property {BlocksDominancePattern} eobot + * @property {BlocksDominancePattern} unomp + * @property {BlocksDominancePattern} patels + * @property {BlocksDominancePattern} gogreenlight + * @property {BlocksDominancePattern} bitcoinindiapool + * @property {BlocksDominancePattern} ekanembtc + * @property {BlocksDominancePattern} canoe + * @property {BlocksDominancePattern} tiger + * @property {BlocksDominancePattern} onem1x + * @property {BlocksDominancePattern} zulupool + * @property {BlocksDominancePattern} wiz + * @property {BlocksDominancePattern} wk057 + * @property {BlocksDominancePattern} futurebitapollosolo + * @property {BlocksDominancePattern} carbonnegative + * @property {BlocksDominancePattern} portlandhodl + * @property {BlocksDominancePattern} phoenix + * @property {BlocksDominancePattern} neopool + * @property {BlocksDominancePattern} maxipool + * @property {BlocksDominancePattern} bitfufupool + * @property {BlocksDominancePattern} gdpool + * @property {BlocksDominancePattern} miningdutch + * @property {BlocksDominancePattern} publicpool + * @property {BlocksDominancePattern} miningsquared + * @property {BlocksDominancePattern} innopolistech + * @property {BlocksDominancePattern} btclab + * @property {BlocksDominancePattern} parasite + * @property {BlocksDominancePattern} redrockpool + * @property {BlocksDominancePattern} est3lar + * @property {BlocksDominancePattern} braiinssolo + * @property {BlocksDominancePattern} solopool + * @property {BlocksDominancePattern} noderunners + */ + +/** + * @typedef {Object} SeriesTree_Prices + * @property {SeriesTree_Prices_Split} split + * @property {SeriesTree_Prices_Ohlc} ohlc + * @property {SeriesTree_Prices_Spot} spot + */ + +/** + * @typedef {Object} SeriesTree_Prices_Split + * @property {CentsSatsUsdPattern3} open + * @property {CentsSatsUsdPattern3} high + * @property {CentsSatsUsdPattern3} low + * @property {CentsSatsUsdPattern3} close + */ + +/** + * @typedef {Object} SeriesTree_Prices_Ohlc + * @property {SeriesPattern2} usd + * @property {SeriesPattern2} cents + * @property {SeriesPattern2} sats + */ + +/** + * @typedef {Object} SeriesTree_Prices_Spot + * @property {SeriesPattern1} usd + * @property {SeriesPattern1} cents + * @property {SeriesPattern1} sats + */ + +/** + * @typedef {Object} SeriesTree_Supply + * @property {SeriesPattern18} state + * @property {BtcCentsSatsUsdPattern} circulating + * @property {BlockCumulativePattern} burned + * @property {BpsPercentRatioPattern} inflationRate + * @property {SeriesTree_Supply_Velocity} velocity + * @property {CentsDeltaUsdPattern} marketCap + * @property {_1m1w1y24hPattern} marketMinusRealizedCapGrowthRate + * @property {BtcCentsSatsUsdPattern} hodledOrLost + */ + +/** + * @typedef {Object} SeriesTree_Supply_Velocity + * @property {SeriesPattern1} native + * @property {SeriesPattern1} fiat + */ + +/** + * @typedef {Object} SeriesTree_Cohorts + * @property {SeriesTree_Cohorts_Utxo} utxo + * @property {SeriesTree_Cohorts_Addr} addr + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo + * @property {SeriesTree_Cohorts_Utxo_All} all + * @property {SeriesTree_Cohorts_Utxo_Sth} sth + * @property {SeriesTree_Cohorts_Utxo_Lth} lth + * @property {SeriesTree_Cohorts_Utxo_AgeRange} ageRange + * @property {SeriesTree_Cohorts_Utxo_UnderAge} underAge + * @property {SeriesTree_Cohorts_Utxo_OverAge} overAge + * @property {SeriesTree_Cohorts_Utxo_Epoch} epoch + * @property {SeriesTree_Cohorts_Utxo_Class} class + * @property {SeriesTree_Cohorts_Utxo_OverAmount} overAmount + * @property {SeriesTree_Cohorts_Utxo_AmountRange} amountRange + * @property {SeriesTree_Cohorts_Utxo_UnderAmount} underAmount + * @property {SeriesTree_Cohorts_Utxo_Type} type + * @property {SeriesTree_Cohorts_Utxo_Profitability} profitability + * @property {SeriesTree_Cohorts_Utxo_Matured} matured + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_All + * @property {DeltaDominanceHalfInTotalPattern2} supply + * @property {SeriesTree_Cohorts_Utxo_All_Outputs} outputs + * @property {SeriesTree_Cohorts_Utxo_All_Activity} activity + * @property {SeriesTree_Cohorts_Utxo_All_Realized} realized + * @property {SeriesTree_Cohorts_Utxo_All_CostBasis} costBasis + * @property {SeriesTree_Cohorts_Utxo_All_Unrealized} unrealized + * @property {InPattern} investedCapital + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Outputs + * @property {BaseDeltaPattern} unspentCount + * @property {AverageBlockCumulativeSumPattern2} spentCount + * @property {SeriesPattern1} spendingRate + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Activity + * @property {AverageBlockCumulativeInSumPattern} transferVolume + * @property {AverageBlockCumulativeSumPattern} coindaysDestroyed + * @property {SeriesPattern1} coinyearsDestroyed + * @property {_1m1w1y24hPattern} dormancy + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Realized + * @property {CentsDeltaToUsdPattern} cap + * @property {BlockCumulativeSumPattern} profit + * @property {BlockCumulativeNegativeSumPattern} loss + * @property {SeriesTree_Cohorts_Utxo_All_Realized_Price} price + * @property {SeriesPattern1} mvrv + * @property {BlockChangeCumulativeDeltaSumPattern} netPnl + * @property {SeriesTree_Cohorts_Utxo_All_Realized_Sopr} sopr + * @property {BlockCumulativeSumPattern} grossPnl + * @property {_1m1w1y24hPattern8} sellSideRiskRatio + * @property {BlockCumulativeSumPattern} peakRegret + * @property {PricePattern} capitalized + * @property {_1m1w1y24hPattern} profitToLossRatio + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Realized_Price + * @property {SeriesPattern1} usd + * @property {SeriesPattern1} cents + * @property {SeriesPattern1} sats + * @property {SeriesPattern1} bps + * @property {SeriesPattern1} ratio + * @property {Pct0Pct1Pct2Pct5Pct95Pct98Pct99Pattern} percentiles + * @property {_1m1w1y2y4yAllPattern} sma + * @property {SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev} stdDev + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev + * @property {SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_All} all + * @property {SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_4y} _4y + * @property {SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_2y} _2y + * @property {SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_1y} _1y + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_All + * @property {SeriesPattern1} sd + * @property {SeriesPattern1} zscore + * @property {CentsSatsUsdPattern} _0sd + * @property {PriceRatioPattern} p05sd + * @property {PriceRatioPattern} p1sd + * @property {PriceRatioPattern} p15sd + * @property {PriceRatioPattern} p2sd + * @property {PriceRatioPattern} p25sd + * @property {PriceRatioPattern} p3sd + * @property {PriceRatioPattern} m05sd + * @property {PriceRatioPattern} m1sd + * @property {PriceRatioPattern} m15sd + * @property {PriceRatioPattern} m2sd + * @property {PriceRatioPattern} m25sd + * @property {PriceRatioPattern} m3sd + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_4y + * @property {SeriesPattern1} sd + * @property {SeriesPattern1} zscore + * @property {CentsSatsUsdPattern} _0sd + * @property {PriceRatioPattern} p05sd + * @property {PriceRatioPattern} p1sd + * @property {PriceRatioPattern} p15sd + * @property {PriceRatioPattern} p2sd + * @property {PriceRatioPattern} p25sd + * @property {PriceRatioPattern} p3sd + * @property {PriceRatioPattern} m05sd + * @property {PriceRatioPattern} m1sd + * @property {PriceRatioPattern} m15sd + * @property {PriceRatioPattern} m2sd + * @property {PriceRatioPattern} m25sd + * @property {PriceRatioPattern} m3sd + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_2y + * @property {SeriesPattern1} sd + * @property {SeriesPattern1} zscore + * @property {CentsSatsUsdPattern} _0sd + * @property {PriceRatioPattern} p05sd + * @property {PriceRatioPattern} p1sd + * @property {PriceRatioPattern} p15sd + * @property {PriceRatioPattern} p2sd + * @property {PriceRatioPattern} p25sd + * @property {PriceRatioPattern} p3sd + * @property {PriceRatioPattern} m05sd + * @property {PriceRatioPattern} m1sd + * @property {PriceRatioPattern} m15sd + * @property {PriceRatioPattern} m2sd + * @property {PriceRatioPattern} m25sd + * @property {PriceRatioPattern} m3sd + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_1y + * @property {SeriesPattern1} sd + * @property {SeriesPattern1} zscore + * @property {CentsSatsUsdPattern} _0sd + * @property {PriceRatioPattern} p05sd + * @property {PriceRatioPattern} p1sd + * @property {PriceRatioPattern} p15sd + * @property {PriceRatioPattern} p2sd + * @property {PriceRatioPattern} p25sd + * @property {PriceRatioPattern} p3sd + * @property {PriceRatioPattern} m05sd + * @property {PriceRatioPattern} m1sd + * @property {PriceRatioPattern} m15sd + * @property {PriceRatioPattern} m2sd + * @property {PriceRatioPattern} m25sd + * @property {PriceRatioPattern} m3sd + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Realized_Sopr + * @property {AverageBlockCumulativeSumPattern} valueDestroyed + * @property {_1m1w1y24hPattern} ratio + * @property {SeriesTree_Cohorts_Utxo_All_Realized_Sopr_Adjusted} adjusted + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Realized_Sopr_Adjusted + * @property {_1m1w1y24hPattern} ratio + * @property {AverageBlockCumulativeSumPattern} transferVolume + * @property {AverageBlockCumulativeSumPattern} valueDestroyed + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_All_CostBasis + * @property {PerPattern} inProfit + * @property {PerPattern} inLoss + * @property {CentsSatsUsdPattern} min + * @property {CentsSatsUsdPattern} max + * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} perCoin + * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} perDollar + * @property {BpsPercentRatioPattern2} supplyDensity + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Unrealized + * @property {BpsRatioPattern} nupl + * @property {SeriesTree_Cohorts_Utxo_All_Unrealized_Profit} profit + * @property {SeriesTree_Cohorts_Utxo_All_Unrealized_Loss} loss + * @property {SeriesTree_Cohorts_Utxo_All_Unrealized_NetPnl} netPnl + * @property {CentsUsdPattern3} grossPnl + * @property {InPattern2} investedCapital + * @property {SeriesPattern18} capitalizedCapInProfitRaw + * @property {SeriesPattern18} capitalizedCapInLossRaw + * @property {SeriesTree_Cohorts_Utxo_All_Unrealized_Sentiment} sentiment + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Unrealized_Profit + * @property {SeriesPattern1} usd + * @property {SeriesPattern1} cents + * @property {BpsPercentRatioPattern2} toMcap + * @property {BpsPercentRatioPattern2} toOwnGrossPnl + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Unrealized_Loss + * @property {SeriesPattern1} usd + * @property {SeriesPattern1} cents + * @property {SeriesPattern1} negative + * @property {BpsPercentRatioPattern2} toMcap + * @property {BpsPercentRatioPattern2} toOwnGrossPnl + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Unrealized_NetPnl + * @property {SeriesPattern1} usd + * @property {SeriesPattern1} cents + * @property {BpsPercentRatioPattern} toOwnGrossPnl + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Unrealized_Sentiment + * @property {CentsUsdPattern3} painIndex + * @property {CentsUsdPattern3} greedIndex + * @property {CentsUsdPattern} net + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_Sth + * @property {DeltaDominanceHalfInTotalPattern2} supply + * @property {SpendingSpentUnspentPattern} outputs + * @property {CoindaysCoinyearsDormancyTransferPattern} activity + * @property {SeriesTree_Cohorts_Utxo_Sth_Realized} realized + * @property {InMaxMinPerSupplyPattern} costBasis + * @property {CapitalizedGrossInvestedLossNetNuplProfitSentimentPattern2} unrealized + * @property {InPattern} investedCapital + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_Sth_Realized + * @property {CentsDeltaToUsdPattern} cap + * @property {BlockCumulativeSumPattern} profit + * @property {BlockCumulativeNegativeSumPattern} loss + * @property {SeriesTree_Cohorts_Utxo_Sth_Realized_Price} price + * @property {SeriesPattern1} mvrv + * @property {BlockChangeCumulativeDeltaSumPattern} netPnl + * @property {AdjustedRatioValuePattern} sopr + * @property {BlockCumulativeSumPattern} grossPnl + * @property {_1m1w1y24hPattern8} sellSideRiskRatio + * @property {BlockCumulativeSumPattern} peakRegret + * @property {PricePattern} capitalized + * @property {_1m1w1y24hPattern} profitToLossRatio + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_Sth_Realized_Price + * @property {SeriesPattern1} usd + * @property {SeriesPattern1} cents + * @property {SeriesPattern1} sats + * @property {SeriesPattern1} bps + * @property {SeriesPattern1} ratio + * @property {Pct0Pct1Pct2Pct5Pct95Pct98Pct99Pattern} percentiles + * @property {_1m1w1y2y4yAllPattern} sma + * @property {SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev} stdDev + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev + * @property {SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_All} all + * @property {SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_4y} _4y + * @property {SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_2y} _2y + * @property {SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_1y} _1y + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_All + * @property {SeriesPattern1} sd + * @property {SeriesPattern1} zscore + * @property {CentsSatsUsdPattern} _0sd + * @property {PriceRatioPattern} p05sd + * @property {PriceRatioPattern} p1sd + * @property {PriceRatioPattern} p15sd + * @property {PriceRatioPattern} p2sd + * @property {PriceRatioPattern} p25sd + * @property {PriceRatioPattern} p3sd + * @property {PriceRatioPattern} m05sd + * @property {PriceRatioPattern} m1sd + * @property {PriceRatioPattern} m15sd + * @property {PriceRatioPattern} m2sd + * @property {PriceRatioPattern} m25sd + * @property {PriceRatioPattern} m3sd + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_4y + * @property {SeriesPattern1} sd + * @property {SeriesPattern1} zscore + * @property {CentsSatsUsdPattern} _0sd + * @property {PriceRatioPattern} p05sd + * @property {PriceRatioPattern} p1sd + * @property {PriceRatioPattern} p15sd + * @property {PriceRatioPattern} p2sd + * @property {PriceRatioPattern} p25sd + * @property {PriceRatioPattern} p3sd + * @property {PriceRatioPattern} m05sd + * @property {PriceRatioPattern} m1sd + * @property {PriceRatioPattern} m15sd + * @property {PriceRatioPattern} m2sd + * @property {PriceRatioPattern} m25sd + * @property {PriceRatioPattern} m3sd + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_2y + * @property {SeriesPattern1} sd + * @property {SeriesPattern1} zscore + * @property {CentsSatsUsdPattern} _0sd + * @property {PriceRatioPattern} p05sd + * @property {PriceRatioPattern} p1sd + * @property {PriceRatioPattern} p15sd + * @property {PriceRatioPattern} p2sd + * @property {PriceRatioPattern} p25sd + * @property {PriceRatioPattern} p3sd + * @property {PriceRatioPattern} m05sd + * @property {PriceRatioPattern} m1sd + * @property {PriceRatioPattern} m15sd + * @property {PriceRatioPattern} m2sd + * @property {PriceRatioPattern} m25sd + * @property {PriceRatioPattern} m3sd + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_1y + * @property {SeriesPattern1} sd + * @property {SeriesPattern1} zscore + * @property {CentsSatsUsdPattern} _0sd + * @property {PriceRatioPattern} p05sd + * @property {PriceRatioPattern} p1sd + * @property {PriceRatioPattern} p15sd + * @property {PriceRatioPattern} p2sd + * @property {PriceRatioPattern} p25sd + * @property {PriceRatioPattern} p3sd + * @property {PriceRatioPattern} m05sd + * @property {PriceRatioPattern} m1sd + * @property {PriceRatioPattern} m15sd + * @property {PriceRatioPattern} m2sd + * @property {PriceRatioPattern} m25sd + * @property {PriceRatioPattern} m3sd + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_Lth + * @property {DeltaDominanceHalfInTotalPattern2} supply + * @property {SpendingSpentUnspentPattern} outputs + * @property {CoindaysCoinyearsDormancyTransferPattern} activity + * @property {SeriesTree_Cohorts_Utxo_Lth_Realized} realized + * @property {InMaxMinPerSupplyPattern} costBasis + * @property {CapitalizedGrossInvestedLossNetNuplProfitSentimentPattern2} unrealized + * @property {InPattern} investedCapital + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_Lth_Realized + * @property {CentsDeltaToUsdPattern} cap + * @property {BlockCumulativeSumPattern} profit + * @property {BlockCumulativeNegativeSumPattern} loss + * @property {SeriesTree_Cohorts_Utxo_Lth_Realized_Price} price + * @property {SeriesPattern1} mvrv + * @property {BlockChangeCumulativeDeltaSumPattern} netPnl + * @property {SeriesTree_Cohorts_Utxo_Lth_Realized_Sopr} sopr + * @property {BlockCumulativeSumPattern} grossPnl + * @property {_1m1w1y24hPattern8} sellSideRiskRatio + * @property {BlockCumulativeSumPattern} peakRegret + * @property {PricePattern} capitalized + * @property {_1m1w1y24hPattern} profitToLossRatio + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_Lth_Realized_Price + * @property {SeriesPattern1} usd + * @property {SeriesPattern1} cents + * @property {SeriesPattern1} sats + * @property {SeriesPattern1} bps + * @property {SeriesPattern1} ratio + * @property {Pct0Pct1Pct2Pct5Pct95Pct98Pct99Pattern} percentiles + * @property {_1m1w1y2y4yAllPattern} sma + * @property {SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev} stdDev + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev + * @property {SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_All} all + * @property {SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_4y} _4y + * @property {SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_2y} _2y + * @property {SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_1y} _1y + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_All + * @property {SeriesPattern1} sd + * @property {SeriesPattern1} zscore + * @property {CentsSatsUsdPattern} _0sd + * @property {PriceRatioPattern} p05sd + * @property {PriceRatioPattern} p1sd + * @property {PriceRatioPattern} p15sd + * @property {PriceRatioPattern} p2sd + * @property {PriceRatioPattern} p25sd + * @property {PriceRatioPattern} p3sd + * @property {PriceRatioPattern} m05sd + * @property {PriceRatioPattern} m1sd + * @property {PriceRatioPattern} m15sd + * @property {PriceRatioPattern} m2sd + * @property {PriceRatioPattern} m25sd + * @property {PriceRatioPattern} m3sd + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_4y + * @property {SeriesPattern1} sd + * @property {SeriesPattern1} zscore + * @property {CentsSatsUsdPattern} _0sd + * @property {PriceRatioPattern} p05sd + * @property {PriceRatioPattern} p1sd + * @property {PriceRatioPattern} p15sd + * @property {PriceRatioPattern} p2sd + * @property {PriceRatioPattern} p25sd + * @property {PriceRatioPattern} p3sd + * @property {PriceRatioPattern} m05sd + * @property {PriceRatioPattern} m1sd + * @property {PriceRatioPattern} m15sd + * @property {PriceRatioPattern} m2sd + * @property {PriceRatioPattern} m25sd + * @property {PriceRatioPattern} m3sd + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_2y + * @property {SeriesPattern1} sd + * @property {SeriesPattern1} zscore + * @property {CentsSatsUsdPattern} _0sd + * @property {PriceRatioPattern} p05sd + * @property {PriceRatioPattern} p1sd + * @property {PriceRatioPattern} p15sd + * @property {PriceRatioPattern} p2sd + * @property {PriceRatioPattern} p25sd + * @property {PriceRatioPattern} p3sd + * @property {PriceRatioPattern} m05sd + * @property {PriceRatioPattern} m1sd + * @property {PriceRatioPattern} m15sd + * @property {PriceRatioPattern} m2sd + * @property {PriceRatioPattern} m25sd + * @property {PriceRatioPattern} m3sd + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_1y + * @property {SeriesPattern1} sd + * @property {SeriesPattern1} zscore + * @property {CentsSatsUsdPattern} _0sd + * @property {PriceRatioPattern} p05sd + * @property {PriceRatioPattern} p1sd + * @property {PriceRatioPattern} p15sd + * @property {PriceRatioPattern} p2sd + * @property {PriceRatioPattern} p25sd + * @property {PriceRatioPattern} p3sd + * @property {PriceRatioPattern} m05sd + * @property {PriceRatioPattern} m1sd + * @property {PriceRatioPattern} m15sd + * @property {PriceRatioPattern} m2sd + * @property {PriceRatioPattern} m25sd + * @property {PriceRatioPattern} m3sd + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_Lth_Realized_Sopr + * @property {AverageBlockCumulativeSumPattern} valueDestroyed + * @property {_1m1w1y24hPattern} ratio + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_AgeRange + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} under1h + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1hTo1d + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1dTo1w + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1wTo1m + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1mTo2m + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2mTo3m + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _3mTo4m + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _4mTo5m + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _5mTo6m + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _6mTo1y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1yTo2y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2yTo3y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _3yTo4y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _4yTo5y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _5yTo6y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _6yTo7y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _7yTo8y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _8yTo10y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _10yTo12y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _12yTo15y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} over15y + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_UnderAge + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1w + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1m + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2m + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _3m + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _4m + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _5m + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _6m + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _3y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _4y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _5y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _6y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _7y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _8y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _10y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _12y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _15y + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_OverAge + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1d + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1w + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1m + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2m + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _3m + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _4m + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _5m + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _6m + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _3y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _4y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _5y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _6y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _7y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _8y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _10y + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _12y + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_Epoch + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _0 + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1 + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2 + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _3 + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _4 + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_Class + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2009 + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2010 + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2011 + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2012 + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2013 + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2014 + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2015 + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2016 + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2017 + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2018 + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2019 + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2020 + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2021 + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2022 + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2023 + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2024 + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2025 + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2026 + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_OverAmount + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1sat + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10sats + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _100sats + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1kSats + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10kSats + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _100kSats + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1mSats + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10mSats + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1btc + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10btc + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _100btc + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1kBtc + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10kBtc + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_AmountRange + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _0sats + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1satTo10sats + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10satsTo100sats + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _100satsTo1kSats + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1kSatsTo10kSats + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10kSatsTo100kSats + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _100kSatsTo1mSats + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1mSatsTo10mSats + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10mSatsTo1btc + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1btcTo10btc + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10btcTo100btc + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _100btcTo1kBtc + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1kBtcTo10kBtc + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10kBtcTo100kBtc + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} over100kBtc + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_UnderAmount + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10sats + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _100sats + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1kSats + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10kSats + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _100kSats + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1mSats + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10mSats + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1btc + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10btc + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _100btc + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1kBtc + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10kBtc + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _100kBtc + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_Type + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern3} p2pk65 + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern3} p2pk33 + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern3} p2pkh + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern3} p2ms + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern3} p2sh + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern3} p2wpkh + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern3} p2wsh + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern3} p2tr + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern3} p2a + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern3} unknown + * @property {ActivityOutputsRealizedSupplyUnrealizedPattern3} empty + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_Profitability + * @property {SeriesTree_Cohorts_Utxo_Profitability_Range} range + * @property {SeriesTree_Cohorts_Utxo_Profitability_Profit} profit + * @property {SeriesTree_Cohorts_Utxo_Profitability_Loss} loss + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_Profitability_Range + * @property {NuplRealizedSupplyUnrealizedPattern} over1000pctInProfit + * @property {NuplRealizedSupplyUnrealizedPattern} _500pctTo1000pctInProfit + * @property {NuplRealizedSupplyUnrealizedPattern} _300pctTo500pctInProfit + * @property {NuplRealizedSupplyUnrealizedPattern} _200pctTo300pctInProfit + * @property {NuplRealizedSupplyUnrealizedPattern} _100pctTo200pctInProfit + * @property {NuplRealizedSupplyUnrealizedPattern} _90pctTo100pctInProfit + * @property {NuplRealizedSupplyUnrealizedPattern} _80pctTo90pctInProfit + * @property {NuplRealizedSupplyUnrealizedPattern} _70pctTo80pctInProfit + * @property {NuplRealizedSupplyUnrealizedPattern} _60pctTo70pctInProfit + * @property {NuplRealizedSupplyUnrealizedPattern} _50pctTo60pctInProfit + * @property {NuplRealizedSupplyUnrealizedPattern} _40pctTo50pctInProfit + * @property {NuplRealizedSupplyUnrealizedPattern} _30pctTo40pctInProfit + * @property {NuplRealizedSupplyUnrealizedPattern} _20pctTo30pctInProfit + * @property {NuplRealizedSupplyUnrealizedPattern} _10pctTo20pctInProfit + * @property {NuplRealizedSupplyUnrealizedPattern} _0pctTo10pctInProfit + * @property {NuplRealizedSupplyUnrealizedPattern} _0pctTo10pctInLoss + * @property {NuplRealizedSupplyUnrealizedPattern} _10pctTo20pctInLoss + * @property {NuplRealizedSupplyUnrealizedPattern} _20pctTo30pctInLoss + * @property {NuplRealizedSupplyUnrealizedPattern} _30pctTo40pctInLoss + * @property {NuplRealizedSupplyUnrealizedPattern} _40pctTo50pctInLoss + * @property {NuplRealizedSupplyUnrealizedPattern} _50pctTo60pctInLoss + * @property {NuplRealizedSupplyUnrealizedPattern} _60pctTo70pctInLoss + * @property {NuplRealizedSupplyUnrealizedPattern} _70pctTo80pctInLoss + * @property {NuplRealizedSupplyUnrealizedPattern} _80pctTo90pctInLoss + * @property {NuplRealizedSupplyUnrealizedPattern} _90pctTo100pctInLoss + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_Profitability_Profit + * @property {NuplRealizedSupplyUnrealizedPattern} all + * @property {NuplRealizedSupplyUnrealizedPattern} _10pct + * @property {NuplRealizedSupplyUnrealizedPattern} _20pct + * @property {NuplRealizedSupplyUnrealizedPattern} _30pct + * @property {NuplRealizedSupplyUnrealizedPattern} _40pct + * @property {NuplRealizedSupplyUnrealizedPattern} _50pct + * @property {NuplRealizedSupplyUnrealizedPattern} _60pct + * @property {NuplRealizedSupplyUnrealizedPattern} _70pct + * @property {NuplRealizedSupplyUnrealizedPattern} _80pct + * @property {NuplRealizedSupplyUnrealizedPattern} _90pct + * @property {NuplRealizedSupplyUnrealizedPattern} _100pct + * @property {NuplRealizedSupplyUnrealizedPattern} _200pct + * @property {NuplRealizedSupplyUnrealizedPattern} _300pct + * @property {NuplRealizedSupplyUnrealizedPattern} _500pct + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_Profitability_Loss + * @property {NuplRealizedSupplyUnrealizedPattern} all + * @property {NuplRealizedSupplyUnrealizedPattern} _10pct + * @property {NuplRealizedSupplyUnrealizedPattern} _20pct + * @property {NuplRealizedSupplyUnrealizedPattern} _30pct + * @property {NuplRealizedSupplyUnrealizedPattern} _40pct + * @property {NuplRealizedSupplyUnrealizedPattern} _50pct + * @property {NuplRealizedSupplyUnrealizedPattern} _60pct + * @property {NuplRealizedSupplyUnrealizedPattern} _70pct + * @property {NuplRealizedSupplyUnrealizedPattern} _80pct + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Utxo_Matured + * @property {AverageBlockCumulativeSumPattern3} under1h + * @property {AverageBlockCumulativeSumPattern3} _1hTo1d + * @property {AverageBlockCumulativeSumPattern3} _1dTo1w + * @property {AverageBlockCumulativeSumPattern3} _1wTo1m + * @property {AverageBlockCumulativeSumPattern3} _1mTo2m + * @property {AverageBlockCumulativeSumPattern3} _2mTo3m + * @property {AverageBlockCumulativeSumPattern3} _3mTo4m + * @property {AverageBlockCumulativeSumPattern3} _4mTo5m + * @property {AverageBlockCumulativeSumPattern3} _5mTo6m + * @property {AverageBlockCumulativeSumPattern3} _6mTo1y + * @property {AverageBlockCumulativeSumPattern3} _1yTo2y + * @property {AverageBlockCumulativeSumPattern3} _2yTo3y + * @property {AverageBlockCumulativeSumPattern3} _3yTo4y + * @property {AverageBlockCumulativeSumPattern3} _4yTo5y + * @property {AverageBlockCumulativeSumPattern3} _5yTo6y + * @property {AverageBlockCumulativeSumPattern3} _6yTo7y + * @property {AverageBlockCumulativeSumPattern3} _7yTo8y + * @property {AverageBlockCumulativeSumPattern3} _8yTo10y + * @property {AverageBlockCumulativeSumPattern3} _10yTo12y + * @property {AverageBlockCumulativeSumPattern3} _12yTo15y + * @property {AverageBlockCumulativeSumPattern3} over15y + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Addr + * @property {SeriesTree_Cohorts_Addr_OverAmount} overAmount + * @property {SeriesTree_Cohorts_Addr_AmountRange} amountRange + * @property {SeriesTree_Cohorts_Addr_UnderAmount} underAmount + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Addr_OverAmount + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1sat + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10sats + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _100sats + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1kSats + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10kSats + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _100kSats + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1mSats + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10mSats + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1btc + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10btc + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _100btc + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1kBtc + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10kBtc + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Addr_AmountRange + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _0sats + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1satTo10sats + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10satsTo100sats + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _100satsTo1kSats + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1kSatsTo10kSats + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10kSatsTo100kSats + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _100kSatsTo1mSats + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1mSatsTo10mSats + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10mSatsTo1btc + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1btcTo10btc + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10btcTo100btc + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _100btcTo1kBtc + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1kBtcTo10kBtc + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10kBtcTo100kBtc + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} over100kBtc + */ + +/** + * @typedef {Object} SeriesTree_Cohorts_Addr_UnderAmount + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10sats + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _100sats + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1kSats + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10kSats + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _100kSats + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1mSats + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10mSats + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1btc + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10btc + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _100btc + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1kBtc + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10kBtc + * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _100kBtc + */ + +/** + * Main BRK client with series tree and API methods + * @extends BrkClientBase + */ +class BrkClient extends BrkClientBase { + VERSION = "v0.3.1"; + + INDEXES = /** @type {const} */ ([ + "minute10", + "minute30", + "hour1", + "hour4", + "hour12", + "day1", + "day3", + "week1", + "month1", + "month3", + "month6", + "year1", + "year10", + "halving", + "epoch", + "height", + "tx_index", + "txin_index", + "txout_index", + "empty_output_index", + "op_return_index", + "p2a_addr_index", + "p2ms_output_index", + "p2pk33_addr_index", + "p2pk65_addr_index", + "p2pkh_addr_index", + "p2sh_addr_index", + "p2tr_addr_index", + "p2wpkh_addr_index", + "p2wsh_addr_index", + "unknown_output_index", + "funded_addr_index", + "empty_addr_index" + ]); + + POOL_ID_TO_POOL_NAME = /** @type {const} */ ({ + "aaopool": "AAO Pool", + "antpool": "AntPool", + "arkpool": "ArkPool", + "asicminer": "ASICMiner", + "axbt": "A-XBT", + "batpool": "BATPOOL", + "bcmonster": "BCMonster", + "bcpoolio": "bcpool.io", + "binancepool": "Binance Pool", + "bitalo": "Bitalo", + "bitclub": "BitClub", + "bitcoinaffiliatenetwork": "Bitcoin Affiliate Network", + "bitcoincom": "Bitcoin.com", + "bitcoinindia": "Bitcoin India", + "bitcoinindiapool": "BitcoinIndia", + "bitcoinrussia": "BitcoinRussia", + "bitcoinukraine": "Bitcoin-Ukraine", + "bitfarms": "Bitfarms", + "bitfufupool": "BitFuFuPool", + "bitfury": "BitFury", + "bitminter": "BitMinter", + "bitparking": "Bitparking", + "bitsolo": "Bitsolo", + "bixin": "Bixin", + "blockfills": "BlockFills", + "braiinspool": "Braiins Pool", + "braiinssolo": "Braiins Solo", + "bravomining": "Bravo Mining", + "btcc": "BTCC", + "btccom": "BTC.com", + "btcdig": "BTCDig", + "btcguild": "BTC Guild", + "btclab": "BTCLab", + "btcmp": "BTCMP", + "btcnuggets": "BTC Nuggets", + "btcpoolparty": "BTC Pool Party", + "btcserv": "BTCServ", + "btctop": "BTC.TOP", + "btpool": "BTPOOL", + "bwpool": "BWPool", + "bytepool": "BytePool", + "canoe": "CANOE", + "canoepool": "CanoePool", + "carbonnegative": "Carbon Negative", + "ckpool": "CKPool", + "cloudhashing": "CloudHashing", + "coinlab": "CoinLab", + "cointerra": "Cointerra", + "connectbtc": "ConnectBTC", + "dcex": "DCEX", + "dcexploration": "DCExploration", + "digitalbtc": "digitalBTC", + "digitalxmintsy": "digitalX Mintsy", + "dpool": "DPOOL", + "eclipsemc": "EclipseMC", + "eightbaochi": "8baochi", + "ekanembtc": "EkanemBTC", + "eligius": "Eligius", + "emcdpool": "EMCDPool", + "entrustcharitypool": "Entrust Charity Pool", + "eobot": "Eobot", + "est3lar": "Est3lar", + "exxbw": "EXX&BW", + "f2pool": "F2Pool", + "fiftyeightcoin": "58COIN", + "foundryusa": "Foundry USA", + "futurebitapollosolo": "FutureBit Apollo Solo", + "gbminers": "GBMiners", + "gdpool": "GDPool", + "ghashio": "GHash.IO", + "givemecoins": "Give Me Coins", + "gogreenlight": "GoGreenLight", + "haominer": "haominer", + "haozhuzhu": "HAOZHUZHU", + "hashbx": "HashBX", + "hashpool": "HASHPOOL", + "helix": "Helix", + "hhtt": "HHTT", + "hotpool": "HotPool", + "hummerpool": "Hummerpool", + "huobipool": "Huobi.pool", + "innopolistech": "Innopolis Tech", + "kanopool": "KanoPool", + "kncminer": "KnCMiner", + "kucoinpool": "KuCoinPool", + "lubiancom": "Lubian.com", + "luxor": "Luxor", + "marapool": "MARA Pool", + "maxbtc": "MaxBTC", + "maxipool": "MaxiPool", + "megabigpower": "MegaBigPower", + "minerium": "Minerium", + "miningcity": "MiningCity", + "miningdutch": "Mining-Dutch", + "miningkings": "MiningKings", + "miningsquared": "Mining Squared", + "mmpool": "mmpool", + "mtred": "Mt Red", + "multicoinco": "MultiCoin.co", + "multipool": "Multipool", + "mybtccoinpool": "myBTCcoin Pool", + "neopool": "Neopool", + "nexious": "Nexious", + "nicehash": "NiceHash", + "nmcbit": "NMCbit", + "noderunners": "Noderunners", + "novablock": "NovaBlock", + "ocean": "OCEAN", + "okexpool": "OKExPool", + "okkong": "OKKONG", + "okminer": "OKMINER", + "okpooltop": "okpool.top", + "onehash": "1Hash", + "onem1x": "1M1X", + "onethash": "1THash", + "ozcoin": "OzCoin", + "parasite": "Parasite", + "patels": "Patels", + "pegapool": "PEGA Pool", + "phashio": "PHash.IO", + "phoenix": "Phoenix", + "polmine": "Polmine", + "pool175btc": "175btc", + "pool50btc": "50BTC", + "poolin": "Poolin", + "portlandhodl": "Portland.HODL", + "publicpool": "Public Pool", + "purebtccom": "PureBTC.COM", + "rawpool": "Rawpool", + "redrockpool": "RedRock Pool", + "rigpool": "RigPool", + "sbicrypto": "SBI Crypto", + "secpool": "SECPOOL", + "secretsuperstar": "SecretSuperstar", + "sevenpool": "7pool", + "shawnp0wers": "shawnp0wers", + "sigmapoolcom": "Sigmapool.com", + "simplecoinus": "simplecoin.us", + "solock": "Solo CK", + "solopool": "SoloPool.com", + "spiderpool": "SpiderPool", + "stminingcorp": "ST Mining Corp", + "tangpool": "Tangpool", + "tatmaspool": "TATMAS Pool", + "tbdice": "TBDice", + "telco214": "Telco 214", + "terrapool": "Terra Pool", + "tiger": "tiger", + "tigerpoolnet": "tigerpool.net", + "titan": "Titan", + "transactioncoinmining": "transactioncoinmining", + "trickysbtcpool": "Tricky's BTC Pool", + "triplemining": "TripleMining", + "twentyoneinc": "21 Inc.", + "ultimuspool": "ULTIMUSPOOL", + "unknown": "Unknown", + "unomp": "UNOMP", + "viabtc": "ViaBTC", + "waterhole": "Waterhole", + "wayicn": "WAYI.CN", + "whitepool": "WhitePool", + "wiz": "wiz", + "wk057": "wk057", + "yourbtcnet": "Yourbtc.net", + "zulupool": "Zulupool" + }); + + TERM_NAMES = /** @type {const} */ ({ + "short": { + "id": "sth", + "short": "STH", + "long": "Short Term Holders" + }, + "long": { + "id": "lth", + "short": "LTH", + "long": "Long Term Holders" + } + }); + + EPOCH_NAMES = /** @type {const} */ ({ + "_0": { + "id": "epoch_0", + "short": "0", + "long": "Epoch 0" + }, + "_1": { + "id": "epoch_1", + "short": "1", + "long": "Epoch 1" + }, + "_2": { + "id": "epoch_2", + "short": "2", + "long": "Epoch 2" + }, + "_3": { + "id": "epoch_3", + "short": "3", + "long": "Epoch 3" + }, + "_4": { + "id": "epoch_4", + "short": "4", + "long": "Epoch 4" + } + }); + + CLASS_NAMES = /** @type {const} */ ({ + "_2009": { + "id": "class_2009", + "short": "2009", + "long": "Class 2009" + }, + "_2010": { + "id": "class_2010", + "short": "2010", + "long": "Class 2010" + }, + "_2011": { + "id": "class_2011", + "short": "2011", + "long": "Class 2011" + }, + "_2012": { + "id": "class_2012", + "short": "2012", + "long": "Class 2012" + }, + "_2013": { + "id": "class_2013", + "short": "2013", + "long": "Class 2013" + }, + "_2014": { + "id": "class_2014", + "short": "2014", + "long": "Class 2014" + }, + "_2015": { + "id": "class_2015", + "short": "2015", + "long": "Class 2015" + }, + "_2016": { + "id": "class_2016", + "short": "2016", + "long": "Class 2016" + }, + "_2017": { + "id": "class_2017", + "short": "2017", + "long": "Class 2017" + }, + "_2018": { + "id": "class_2018", + "short": "2018", + "long": "Class 2018" + }, + "_2019": { + "id": "class_2019", + "short": "2019", + "long": "Class 2019" + }, + "_2020": { + "id": "class_2020", + "short": "2020", + "long": "Class 2020" + }, + "_2021": { + "id": "class_2021", + "short": "2021", + "long": "Class 2021" + }, + "_2022": { + "id": "class_2022", + "short": "2022", + "long": "Class 2022" + }, + "_2023": { + "id": "class_2023", + "short": "2023", + "long": "Class 2023" + }, + "_2024": { + "id": "class_2024", + "short": "2024", + "long": "Class 2024" + }, + "_2025": { + "id": "class_2025", + "short": "2025", + "long": "Class 2025" + }, + "_2026": { + "id": "class_2026", + "short": "2026", + "long": "Class 2026" + } + }); + + SPENDABLE_TYPE_NAMES = /** @type {const} */ ({ + "p2pk65": { + "id": "p2pk65", + "short": "P2PK65", + "long": "Pay to Public Key (65 bytes)" + }, + "p2pk33": { + "id": "p2pk33", + "short": "P2PK33", + "long": "Pay to Public Key (33 bytes)" + }, + "p2pkh": { + "id": "p2pkh", + "short": "P2PKH", + "long": "Pay to Public Key Hash" + }, + "p2ms": { + "id": "p2ms", + "short": "P2MS", + "long": "Pay to Multisig" + }, + "p2sh": { + "id": "p2sh", + "short": "P2SH", + "long": "Pay to Script Hash" + }, + "p2wpkh": { + "id": "p2wpkh", + "short": "P2WPKH", + "long": "Pay to Witness Public Key Hash" + }, + "p2wsh": { + "id": "p2wsh", + "short": "P2WSH", + "long": "Pay to Witness Script Hash" + }, + "p2tr": { + "id": "p2tr", + "short": "P2TR", + "long": "Pay to Taproot" + }, + "p2a": { + "id": "p2a", + "short": "P2A", + "long": "Pay to Anchor" + }, + "unknown": { + "id": "unknown_outputs", + "short": "Unknown", + "long": "Unknown Output Type" + }, + "empty": { + "id": "empty_outputs", + "short": "Empty", + "long": "Empty Output" + } + }); + + AGE_RANGE_NAMES = /** @type {const} */ ({ + "under1h": { + "id": "under_1h_old", + "short": "<1h", + "long": "Under 1 Hour Old" + }, + "_1hTo1d": { + "id": "1h_to_1d_old", + "short": "1h-1d", + "long": "1 Hour to 1 Day Old" + }, + "_1dTo1w": { + "id": "1d_to_1w_old", + "short": "1d-1w", + "long": "1 Day to 1 Week Old" + }, + "_1wTo1m": { + "id": "1w_to_1m_old", + "short": "1w-1m", + "long": "1 Week to 1 Month Old" + }, + "_1mTo2m": { + "id": "1m_to_2m_old", + "short": "1m-2m", + "long": "1 to 2 Months Old" + }, + "_2mTo3m": { + "id": "2m_to_3m_old", + "short": "2m-3m", + "long": "2 to 3 Months Old" + }, + "_3mTo4m": { + "id": "3m_to_4m_old", + "short": "3m-4m", + "long": "3 to 4 Months Old" + }, + "_4mTo5m": { + "id": "4m_to_5m_old", + "short": "4m-5m", + "long": "4 to 5 Months Old" + }, + "_5mTo6m": { + "id": "5m_to_6m_old", + "short": "5m-6m", + "long": "5 to 6 Months Old" + }, + "_6mTo1y": { + "id": "6m_to_1y_old", + "short": "6m-1y", + "long": "6 Months to 1 Year Old" + }, + "_1yTo2y": { + "id": "1y_to_2y_old", + "short": "1y-2y", + "long": "1 to 2 Years Old" + }, + "_2yTo3y": { + "id": "2y_to_3y_old", + "short": "2y-3y", + "long": "2 to 3 Years Old" + }, + "_3yTo4y": { + "id": "3y_to_4y_old", + "short": "3y-4y", + "long": "3 to 4 Years Old" + }, + "_4yTo5y": { + "id": "4y_to_5y_old", + "short": "4y-5y", + "long": "4 to 5 Years Old" + }, + "_5yTo6y": { + "id": "5y_to_6y_old", + "short": "5y-6y", + "long": "5 to 6 Years Old" + }, + "_6yTo7y": { + "id": "6y_to_7y_old", + "short": "6y-7y", + "long": "6 to 7 Years Old" + }, + "_7yTo8y": { + "id": "7y_to_8y_old", + "short": "7y-8y", + "long": "7 to 8 Years Old" + }, + "_8yTo10y": { + "id": "8y_to_10y_old", + "short": "8y-10y", + "long": "8 to 10 Years Old" + }, + "_10yTo12y": { + "id": "10y_to_12y_old", + "short": "10y-12y", + "long": "10 to 12 Years Old" + }, + "_12yTo15y": { + "id": "12y_to_15y_old", + "short": "12y-15y", + "long": "12 to 15 Years Old" + }, + "over15y": { + "id": "over_15y_old", + "short": "15y+", + "long": "15+ Years Old" + } + }); + + UNDER_AGE_NAMES = /** @type {const} */ ({ + "_1w": { + "id": "under_1w_old", + "short": "<1w", + "long": "Under 1 Week Old" + }, + "_1m": { + "id": "under_1m_old", + "short": "<1m", + "long": "Under 1 Month Old" + }, + "_2m": { + "id": "under_2m_old", + "short": "<2m", + "long": "Under 2 Months Old" + }, + "_3m": { + "id": "under_3m_old", + "short": "<3m", + "long": "Under 3 Months Old" + }, + "_4m": { + "id": "under_4m_old", + "short": "<4m", + "long": "Under 4 Months Old" + }, + "_5m": { + "id": "under_5m_old", + "short": "<5m", + "long": "Under 5 Months Old" + }, + "_6m": { + "id": "under_6m_old", + "short": "<6m", + "long": "Under 6 Months Old" + }, + "_1y": { + "id": "under_1y_old", + "short": "<1y", + "long": "Under 1 Year Old" + }, + "_2y": { + "id": "under_2y_old", + "short": "<2y", + "long": "Under 2 Years Old" + }, + "_3y": { + "id": "under_3y_old", + "short": "<3y", + "long": "Under 3 Years Old" + }, + "_4y": { + "id": "under_4y_old", + "short": "<4y", + "long": "Under 4 Years Old" + }, + "_5y": { + "id": "under_5y_old", + "short": "<5y", + "long": "Under 5 Years Old" + }, + "_6y": { + "id": "under_6y_old", + "short": "<6y", + "long": "Under 6 Years Old" + }, + "_7y": { + "id": "under_7y_old", + "short": "<7y", + "long": "Under 7 Years Old" + }, + "_8y": { + "id": "under_8y_old", + "short": "<8y", + "long": "Under 8 Years Old" + }, + "_10y": { + "id": "under_10y_old", + "short": "<10y", + "long": "Under 10 Years Old" + }, + "_12y": { + "id": "under_12y_old", + "short": "<12y", + "long": "Under 12 Years Old" + }, + "_15y": { + "id": "under_15y_old", + "short": "<15y", + "long": "Under 15 Years Old" + } + }); + + OVER_AGE_NAMES = /** @type {const} */ ({ + "_1d": { + "id": "over_1d_old", + "short": "1d+", + "long": "Over 1 Day Old" + }, + "_1w": { + "id": "over_1w_old", + "short": "1w+", + "long": "Over 1 Week Old" + }, + "_1m": { + "id": "over_1m_old", + "short": "1m+", + "long": "Over 1 Month Old" + }, + "_2m": { + "id": "over_2m_old", + "short": "2m+", + "long": "Over 2 Months Old" + }, + "_3m": { + "id": "over_3m_old", + "short": "3m+", + "long": "Over 3 Months Old" + }, + "_4m": { + "id": "over_4m_old", + "short": "4m+", + "long": "Over 4 Months Old" + }, + "_5m": { + "id": "over_5m_old", + "short": "5m+", + "long": "Over 5 Months Old" + }, + "_6m": { + "id": "over_6m_old", + "short": "6m+", + "long": "Over 6 Months Old" + }, + "_1y": { + "id": "over_1y_old", + "short": "1y+", + "long": "Over 1 Year Old" + }, + "_2y": { + "id": "over_2y_old", + "short": "2y+", + "long": "Over 2 Years Old" + }, + "_3y": { + "id": "over_3y_old", + "short": "3y+", + "long": "Over 3 Years Old" + }, + "_4y": { + "id": "over_4y_old", + "short": "4y+", + "long": "Over 4 Years Old" + }, + "_5y": { + "id": "over_5y_old", + "short": "5y+", + "long": "Over 5 Years Old" + }, + "_6y": { + "id": "over_6y_old", + "short": "6y+", + "long": "Over 6 Years Old" + }, + "_7y": { + "id": "over_7y_old", + "short": "7y+", + "long": "Over 7 Years Old" + }, + "_8y": { + "id": "over_8y_old", + "short": "8y+", + "long": "Over 8 Years Old" + }, + "_10y": { + "id": "over_10y_old", + "short": "10y+", + "long": "Over 10 Years Old" + }, + "_12y": { + "id": "over_12y_old", + "short": "12y+", + "long": "Over 12 Years Old" + } + }); + + AMOUNT_RANGE_NAMES = /** @type {const} */ ({ + "_0sats": { + "id": "0sats", + "short": "0 sats", + "long": "0 Sats" + }, + "_1satTo10sats": { + "id": "1sat_to_10sats", + "short": "1-10 sats", + "long": "1-10 Sats" + }, + "_10satsTo100sats": { + "id": "10sats_to_100sats", + "short": "10-100 sats", + "long": "10-100 Sats" + }, + "_100satsTo1kSats": { + "id": "100sats_to_1k_sats", + "short": "100-1k sats", + "long": "100-1K Sats" + }, + "_1kSatsTo10kSats": { + "id": "1k_sats_to_10k_sats", + "short": "1k-10k sats", + "long": "1K-10K Sats" + }, + "_10kSatsTo100kSats": { + "id": "10k_sats_to_100k_sats", + "short": "10k-100k sats", + "long": "10K-100K Sats" + }, + "_100kSatsTo1mSats": { + "id": "100k_sats_to_1m_sats", + "short": "100k-1M sats", + "long": "100K-1M Sats" + }, + "_1mSatsTo10mSats": { + "id": "1m_sats_to_10m_sats", + "short": "1M-10M sats", + "long": "1M-10M Sats" + }, + "_10mSatsTo1btc": { + "id": "10m_sats_to_1btc", + "short": "0.1-1 BTC", + "long": "0.1-1 BTC" + }, + "_1btcTo10btc": { + "id": "1btc_to_10btc", + "short": "1-10 BTC", + "long": "1-10 BTC" + }, + "_10btcTo100btc": { + "id": "10btc_to_100btc", + "short": "10-100 BTC", + "long": "10-100 BTC" + }, + "_100btcTo1kBtc": { + "id": "100btc_to_1k_btc", + "short": "100-1k BTC", + "long": "100-1K BTC" + }, + "_1kBtcTo10kBtc": { + "id": "1k_btc_to_10k_btc", + "short": "1k-10k BTC", + "long": "1K-10K BTC" + }, + "_10kBtcTo100kBtc": { + "id": "10k_btc_to_100k_btc", + "short": "10k-100k BTC", + "long": "10K-100K BTC" + }, + "over100kBtc": { + "id": "over_100k_btc", + "short": "100k+ BTC", + "long": "100K+ BTC" + } + }); + + OVER_AMOUNT_NAMES = /** @type {const} */ ({ + "_1sat": { + "id": "over_1sat", + "short": "1+ sats", + "long": "Over 1 Sat" + }, + "_10sats": { + "id": "over_10sats", + "short": "10+ sats", + "long": "Over 10 Sats" + }, + "_100sats": { + "id": "over_100sats", + "short": "100+ sats", + "long": "Over 100 Sats" + }, + "_1kSats": { + "id": "over_1k_sats", + "short": "1k+ sats", + "long": "Over 1K Sats" + }, + "_10kSats": { + "id": "over_10k_sats", + "short": "10k+ sats", + "long": "Over 10K Sats" + }, + "_100kSats": { + "id": "over_100k_sats", + "short": "100k+ sats", + "long": "Over 100K Sats" + }, + "_1mSats": { + "id": "over_1m_sats", + "short": "1M+ sats", + "long": "Over 1M Sats" + }, + "_10mSats": { + "id": "over_10m_sats", + "short": "0.1+ BTC", + "long": "Over 0.1 BTC" + }, + "_1btc": { + "id": "over_1btc", + "short": "1+ BTC", + "long": "Over 1 BTC" + }, + "_10btc": { + "id": "over_10btc", + "short": "10+ BTC", + "long": "Over 10 BTC" + }, + "_100btc": { + "id": "over_100btc", + "short": "100+ BTC", + "long": "Over 100 BTC" + }, + "_1kBtc": { + "id": "over_1k_btc", + "short": "1k+ BTC", + "long": "Over 1K BTC" + }, + "_10kBtc": { + "id": "over_10k_btc", + "short": "10k+ BTC", + "long": "Over 10K BTC" + } + }); + + UNDER_AMOUNT_NAMES = /** @type {const} */ ({ + "_10sats": { + "id": "under_10sats", + "short": "<10 sats", + "long": "Under 10 Sats" + }, + "_100sats": { + "id": "under_100sats", + "short": "<100 sats", + "long": "Under 100 Sats" + }, + "_1kSats": { + "id": "under_1k_sats", + "short": "<1k sats", + "long": "Under 1K Sats" + }, + "_10kSats": { + "id": "under_10k_sats", + "short": "<10k sats", + "long": "Under 10K Sats" + }, + "_100kSats": { + "id": "under_100k_sats", + "short": "<100k sats", + "long": "Under 100K Sats" + }, + "_1mSats": { + "id": "under_1m_sats", + "short": "<1M sats", + "long": "Under 1M Sats" + }, + "_10mSats": { + "id": "under_10m_sats", + "short": "<0.1 BTC", + "long": "Under 0.1 BTC" + }, + "_1btc": { + "id": "under_1btc", + "short": "<1 BTC", + "long": "Under 1 BTC" + }, + "_10btc": { + "id": "under_10btc", + "short": "<10 BTC", + "long": "Under 10 BTC" + }, + "_100btc": { + "id": "under_100btc", + "short": "<100 BTC", + "long": "Under 100 BTC" + }, + "_1kBtc": { + "id": "under_1k_btc", + "short": "<1k BTC", + "long": "Under 1K BTC" + }, + "_10kBtc": { + "id": "under_10k_btc", + "short": "<10k BTC", + "long": "Under 10K BTC" + }, + "_100kBtc": { + "id": "under_100k_btc", + "short": "<100k BTC", + "long": "Under 100K BTC" + } + }); + + PROFITABILITY_RANGE_NAMES = /** @type {const} */ ({ + "over1000pctInProfit": { + "id": "utxos_over_1000pct_in_profit", + "short": "+>1000%", + "long": "Over 1000% in Profit" + }, + "_500pctTo1000pctInProfit": { + "id": "utxos_500pct_to_1000pct_in_profit", + "short": "+500-1000%", + "long": "500-1000% in Profit" + }, + "_300pctTo500pctInProfit": { + "id": "utxos_300pct_to_500pct_in_profit", + "short": "+300-500%", + "long": "300-500% in Profit" + }, + "_200pctTo300pctInProfit": { + "id": "utxos_200pct_to_300pct_in_profit", + "short": "+200-300%", + "long": "200-300% in Profit" + }, + "_100pctTo200pctInProfit": { + "id": "utxos_100pct_to_200pct_in_profit", + "short": "+100-200%", + "long": "100-200% in Profit" + }, + "_90pctTo100pctInProfit": { + "id": "utxos_90pct_to_100pct_in_profit", + "short": "+90-100%", + "long": "90-100% in Profit" + }, + "_80pctTo90pctInProfit": { + "id": "utxos_80pct_to_90pct_in_profit", + "short": "+80-90%", + "long": "80-90% in Profit" + }, + "_70pctTo80pctInProfit": { + "id": "utxos_70pct_to_80pct_in_profit", + "short": "+70-80%", + "long": "70-80% in Profit" + }, + "_60pctTo70pctInProfit": { + "id": "utxos_60pct_to_70pct_in_profit", + "short": "+60-70%", + "long": "60-70% in Profit" + }, + "_50pctTo60pctInProfit": { + "id": "utxos_50pct_to_60pct_in_profit", + "short": "+50-60%", + "long": "50-60% in Profit" + }, + "_40pctTo50pctInProfit": { + "id": "utxos_40pct_to_50pct_in_profit", + "short": "+40-50%", + "long": "40-50% in Profit" + }, + "_30pctTo40pctInProfit": { + "id": "utxos_30pct_to_40pct_in_profit", + "short": "+30-40%", + "long": "30-40% in Profit" + }, + "_20pctTo30pctInProfit": { + "id": "utxos_20pct_to_30pct_in_profit", + "short": "+20-30%", + "long": "20-30% in Profit" + }, + "_10pctTo20pctInProfit": { + "id": "utxos_10pct_to_20pct_in_profit", + "short": "+10-20%", + "long": "10-20% in Profit" + }, + "_0pctTo10pctInProfit": { + "id": "utxos_0pct_to_10pct_in_profit", + "short": "+0-10%", + "long": "0-10% in Profit" + }, + "_0pctTo10pctInLoss": { + "id": "utxos_0pct_to_10pct_in_loss", + "short": "-0-10%", + "long": "0-10% in Loss" + }, + "_10pctTo20pctInLoss": { + "id": "utxos_10pct_to_20pct_in_loss", + "short": "-10-20%", + "long": "10-20% in Loss" + }, + "_20pctTo30pctInLoss": { + "id": "utxos_20pct_to_30pct_in_loss", + "short": "-20-30%", + "long": "20-30% in Loss" + }, + "_30pctTo40pctInLoss": { + "id": "utxos_30pct_to_40pct_in_loss", + "short": "-30-40%", + "long": "30-40% in Loss" + }, + "_40pctTo50pctInLoss": { + "id": "utxos_40pct_to_50pct_in_loss", + "short": "-40-50%", + "long": "40-50% in Loss" + }, + "_50pctTo60pctInLoss": { + "id": "utxos_50pct_to_60pct_in_loss", + "short": "-50-60%", + "long": "50-60% in Loss" + }, + "_60pctTo70pctInLoss": { + "id": "utxos_60pct_to_70pct_in_loss", + "short": "-60-70%", + "long": "60-70% in Loss" + }, + "_70pctTo80pctInLoss": { + "id": "utxos_70pct_to_80pct_in_loss", + "short": "-70-80%", + "long": "70-80% in Loss" + }, + "_80pctTo90pctInLoss": { + "id": "utxos_80pct_to_90pct_in_loss", + "short": "-80-90%", + "long": "80-90% in Loss" + }, + "_90pctTo100pctInLoss": { + "id": "utxos_90pct_to_100pct_in_loss", + "short": "-90-100%", + "long": "90-100% in Loss" + } + }); + + PROFIT_NAMES = /** @type {const} */ ({ + "all": { + "id": "utxos_in_profit", + "short": "All", + "long": "In Profit" + }, + "_10pct": { + "id": "utxos_over_10pct_in_profit", + "short": ">=10%", + "long": "Over 10% in Profit" + }, + "_20pct": { + "id": "utxos_over_20pct_in_profit", + "short": ">=20%", + "long": "Over 20% in Profit" + }, + "_30pct": { + "id": "utxos_over_30pct_in_profit", + "short": ">=30%", + "long": "Over 30% in Profit" + }, + "_40pct": { + "id": "utxos_over_40pct_in_profit", + "short": ">=40%", + "long": "Over 40% in Profit" + }, + "_50pct": { + "id": "utxos_over_50pct_in_profit", + "short": ">=50%", + "long": "Over 50% in Profit" + }, + "_60pct": { + "id": "utxos_over_60pct_in_profit", + "short": ">=60%", + "long": "Over 60% in Profit" + }, + "_70pct": { + "id": "utxos_over_70pct_in_profit", + "short": ">=70%", + "long": "Over 70% in Profit" + }, + "_80pct": { + "id": "utxos_over_80pct_in_profit", + "short": ">=80%", + "long": "Over 80% in Profit" + }, + "_90pct": { + "id": "utxos_over_90pct_in_profit", + "short": ">=90%", + "long": "Over 90% in Profit" + }, + "_100pct": { + "id": "utxos_over_100pct_in_profit", + "short": ">=100%", + "long": "Over 100% in Profit" + }, + "_200pct": { + "id": "utxos_over_200pct_in_profit", + "short": ">=200%", + "long": "Over 200% in Profit" + }, + "_300pct": { + "id": "utxos_over_300pct_in_profit", + "short": ">=300%", + "long": "Over 300% in Profit" + }, + "_500pct": { + "id": "utxos_over_500pct_in_profit", + "short": ">=500%", + "long": "Over 500% in Profit" + } + }); + + LOSS_NAMES = /** @type {const} */ ({ + "all": { + "id": "utxos_in_loss", + "short": "All", + "long": "In Loss" + }, + "_10pct": { + "id": "utxos_over_10pct_in_loss", + "short": ">=10%", + "long": "Over 10% in Loss" + }, + "_20pct": { + "id": "utxos_over_20pct_in_loss", + "short": ">=20%", + "long": "Over 20% in Loss" + }, + "_30pct": { + "id": "utxos_over_30pct_in_loss", + "short": ">=30%", + "long": "Over 30% in Loss" + }, + "_40pct": { + "id": "utxos_over_40pct_in_loss", + "short": ">=40%", + "long": "Over 40% in Loss" + }, + "_50pct": { + "id": "utxos_over_50pct_in_loss", + "short": ">=50%", + "long": "Over 50% in Loss" + }, + "_60pct": { + "id": "utxos_over_60pct_in_loss", + "short": ">=60%", + "long": "Over 60% in Loss" + }, + "_70pct": { + "id": "utxos_over_70pct_in_loss", + "short": ">=70%", + "long": "Over 70% in Loss" + }, + "_80pct": { + "id": "utxos_over_80pct_in_loss", + "short": ">=80%", + "long": "Over 80% in Loss" + } + }); + + /** + * Convert an index value to a Date for date-based indexes. + * @param {Index} index - The index type + * @param {number} i - The index value + * @returns {globalThis.Date} + */ + indexToDate(index, i) { + return indexToDate(index, i); + } + + /** + * Convert a Date to an index value for date-based indexes. + * @param {Index} index - The index type + * @param {globalThis.Date} d - The date to convert + * @returns {number} + */ + dateToIndex(index, d) { + return dateToIndex(index, d); + } + + + /** + * @param {BrkClientOptions|string} options + */ + constructor(options) { + super(options); + /** @type {SeriesTree} */ + this.series = this._buildTree(); + } + + /** + * @private + * @returns {SeriesTree} + */ + _buildTree() { + return { + blocks: { + blockhash: createSeriesPattern18(this, 'blockhash'), + coinbaseTag: createSeriesPattern18(this, 'coinbase_tag'), + difficulty: { + value: createSeriesPattern1(this, 'difficulty'), + hashrate: createSeriesPattern1(this, 'difficulty_hashrate'), + adjustment: createBpsPercentRatioPattern(this, 'difficulty_adjustment'), + epoch: createSeriesPattern1(this, 'difficulty_epoch'), + blocksToRetarget: createSeriesPattern1(this, 'blocks_to_retarget'), + daysToRetarget: createSeriesPattern1(this, 'days_to_retarget'), + }, + time: { + timestamp: createSeriesPattern18(this, 'timestamp'), + }, + size: { + base: createSeriesPattern18(this, 'total_size'), + cumulative: createSeriesPattern1(this, 'block_size_cumulative'), + sum: create_1m1w1y24hPattern(this, 'block_size_sum'), + average: create_1m1w1y24hPattern(this, 'block_size_average'), + min: create_1m1w1y24hPattern(this, 'block_size_min'), + max: create_1m1w1y24hPattern(this, 'block_size_max'), + pct10: create_1m1w1y24hPattern(this, 'block_size_pct10'), + pct25: create_1m1w1y24hPattern(this, 'block_size_pct25'), + median: create_1m1w1y24hPattern(this, 'block_size_median'), + pct75: create_1m1w1y24hPattern(this, 'block_size_pct75'), + pct90: create_1m1w1y24hPattern(this, 'block_size_pct90'), + }, + weight: createAverageBaseCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern(this, 'block_weight'), + segwitTxs: createSeriesPattern18(this, 'segwit_txs'), + segwitSize: createSeriesPattern18(this, 'segwit_size'), + segwitWeight: createSeriesPattern18(this, 'segwit_weight'), + count: { + target: create_1m1w1y24hPattern(this, 'block_count_target'), + total: createAverageBlockCumulativeSumPattern2(this, 'block_count'), + }, + lookback: { + _1h: createSeriesPattern18(this, 'height_1h_ago'), + _24h: createSeriesPattern18(this, 'height_24h_ago'), + _3d: createSeriesPattern18(this, 'height_3d_ago'), + _1w: createSeriesPattern18(this, 'height_1w_ago'), + _8d: createSeriesPattern18(this, 'height_8d_ago'), + _9d: createSeriesPattern18(this, 'height_9d_ago'), + _12d: createSeriesPattern18(this, 'height_12d_ago'), + _13d: createSeriesPattern18(this, 'height_13d_ago'), + _2w: createSeriesPattern18(this, 'height_2w_ago'), + _21d: createSeriesPattern18(this, 'height_21d_ago'), + _26d: createSeriesPattern18(this, 'height_26d_ago'), + _1m: createSeriesPattern18(this, 'height_1m_ago'), + _34d: createSeriesPattern18(this, 'height_34d_ago'), + _55d: createSeriesPattern18(this, 'height_55d_ago'), + _2m: createSeriesPattern18(this, 'height_2m_ago'), + _9w: createSeriesPattern18(this, 'height_9w_ago'), + _12w: createSeriesPattern18(this, 'height_12w_ago'), + _89d: createSeriesPattern18(this, 'height_89d_ago'), + _3m: createSeriesPattern18(this, 'height_3m_ago'), + _14w: createSeriesPattern18(this, 'height_14w_ago'), + _111d: createSeriesPattern18(this, 'height_111d_ago'), + _144d: createSeriesPattern18(this, 'height_144d_ago'), + _6m: createSeriesPattern18(this, 'height_6m_ago'), + _26w: createSeriesPattern18(this, 'height_26w_ago'), + _200d: createSeriesPattern18(this, 'height_200d_ago'), + _9m: createSeriesPattern18(this, 'height_9m_ago'), + _350d: createSeriesPattern18(this, 'height_350d_ago'), + _12m: createSeriesPattern18(this, 'height_12m_ago'), + _1y: createSeriesPattern18(this, 'height_1y_ago'), + _14m: createSeriesPattern18(this, 'height_14m_ago'), + _2y: createSeriesPattern18(this, 'height_2y_ago'), + _26m: createSeriesPattern18(this, 'height_26m_ago'), + _3y: createSeriesPattern18(this, 'height_3y_ago'), + _200w: createSeriesPattern18(this, 'height_200w_ago'), + _4y: createSeriesPattern18(this, 'height_4y_ago'), + _5y: createSeriesPattern18(this, 'height_5y_ago'), + _6y: createSeriesPattern18(this, 'height_6y_ago'), + _8y: createSeriesPattern18(this, 'height_8y_ago'), + _9y: createSeriesPattern18(this, 'height_9y_ago'), + _10y: createSeriesPattern18(this, 'height_10y_ago'), + _12y: createSeriesPattern18(this, 'height_12y_ago'), + _14y: createSeriesPattern18(this, 'height_14y_ago'), + _26y: createSeriesPattern18(this, 'height_26y_ago'), + }, + interval: { + block: createSeriesPattern18(this, 'block_interval'), + _24h: createSeriesPattern1(this, 'block_interval_average_24h'), + _1w: createSeriesPattern1(this, 'block_interval_average_1w'), + _1m: createSeriesPattern1(this, 'block_interval_average_1m'), + _1y: createSeriesPattern1(this, 'block_interval_average_1y'), + }, + vbytes: createAverageBlockCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern(this, 'block_vbytes'), + fullness: { + bps: createSeriesPattern18(this, 'block_fullness_bps'), + ratio: createSeriesPattern18(this, 'block_fullness_ratio'), + percent: createSeriesPattern18(this, 'block_fullness'), + }, + halving: { + epoch: createSeriesPattern1(this, 'halving_epoch'), + blocksToHalving: createSeriesPattern1(this, 'blocks_to_halving'), + daysToHalving: createSeriesPattern1(this, 'days_to_halving'), + }, + }, + transactions: { + raw: { + firstTxIndex: createSeriesPattern18(this, 'first_tx_index'), + txid: createSeriesPattern19(this, 'txid'), + txVersion: createSeriesPattern19(this, 'tx_version'), + rawLocktime: createSeriesPattern19(this, 'raw_locktime'), + baseSize: createSeriesPattern19(this, 'base_size'), + totalSize: createSeriesPattern19(this, 'total_size'), + totalSigopCost: createSeriesPattern19(this, 'total_sigop_cost'), + isExplicitlyRbf: createSeriesPattern19(this, 'is_explicitly_rbf'), + firstTxinIndex: createSeriesPattern19(this, 'first_txin_index'), + firstTxoutIndex: createSeriesPattern19(this, 'first_txout_index'), + }, + count: { + total: createAverageBlockCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern(this, 'tx_count'), + }, + size: { + vsize: create_6bBlockTxPattern(this, 'tx_vsize'), + weight: { + txIndex: createSeriesPattern19(this, 'tx_weight'), + block: createMaxMedianMinPct10Pct25Pct75Pct90Pattern2(this, 'tx_weight'), + _6b: createMaxMedianMinPct10Pct25Pct75Pct90Pattern2(this, 'tx_weight_6b'), + }, + }, + fees: { + inputValue: createSeriesPattern19(this, 'input_value'), + outputValue: createSeriesPattern19(this, 'output_value'), + fee: create_6bBlockTxPattern(this, 'fee'), + feeRate: createSeriesPattern19(this, 'fee_rate'), + effectiveFeeRate: create_6bBlockTxPattern(this, 'effective_fee_rate'), + }, + versions: { + v1: createAverageBlockCumulativeSumPattern(this, 'tx_v1'), + v2: createAverageBlockCumulativeSumPattern(this, 'tx_v2'), + v3: createAverageBlockCumulativeSumPattern(this, 'tx_v3'), + }, + volume: { + transferVolume: createAverageBlockCumulativeSumPattern3(this, 'transfer_volume_bis'), + txPerSec: create_1m1w1y24hPattern(this, 'tx_per_sec'), + }, + }, + inputs: { + raw: { + firstTxinIndex: createSeriesPattern18(this, 'first_txin_index'), + outpoint: createSeriesPattern20(this, 'outpoint'), + txIndex: createSeriesPattern20(this, 'tx_index'), + outputType: createSeriesPattern20(this, 'output_type'), + typeIndex: createSeriesPattern20(this, 'type_index'), + }, + spent: { + txoutIndex: createSeriesPattern20(this, 'txout_index'), + value: createSeriesPattern20(this, 'value'), + }, + count: createCumulativeRollingSumPattern(this, 'input_count'), + perSec: create_1m1w1y24hPattern(this, 'inputs_per_sec'), + byType: { + inputCount: { + all: createAverageBlockCumulativeSumPattern(this, 'input_count_bis'), + p2pk65: createAverageBlockCumulativeSumPattern(this, 'p2pk65_prevout_count'), + p2pk33: createAverageBlockCumulativeSumPattern(this, 'p2pk33_prevout_count'), + p2pkh: createAverageBlockCumulativeSumPattern(this, 'p2pkh_prevout_count'), + p2ms: createAverageBlockCumulativeSumPattern(this, 'p2ms_prevout_count'), + p2sh: createAverageBlockCumulativeSumPattern(this, 'p2sh_prevout_count'), + p2wpkh: createAverageBlockCumulativeSumPattern(this, 'p2wpkh_prevout_count'), + p2wsh: createAverageBlockCumulativeSumPattern(this, 'p2wsh_prevout_count'), + p2tr: createAverageBlockCumulativeSumPattern(this, 'p2tr_prevout_count'), + p2a: createAverageBlockCumulativeSumPattern(this, 'p2a_prevout_count'), + unknown: createAverageBlockCumulativeSumPattern(this, 'unknown_outputs_prevout_count'), + empty: createAverageBlockCumulativeSumPattern(this, 'empty_outputs_prevout_count'), + }, + inputShare: { + p2pk65: create_1m1w1y24hBpsPercentRatioPattern(this, 'p2pk65_prevout_share'), + p2pk33: create_1m1w1y24hBpsPercentRatioPattern(this, 'p2pk33_prevout_share'), + p2pkh: create_1m1w1y24hBpsPercentRatioPattern(this, 'p2pkh_prevout_share'), + p2ms: create_1m1w1y24hBpsPercentRatioPattern(this, 'p2ms_prevout_share'), + p2sh: create_1m1w1y24hBpsPercentRatioPattern(this, 'p2sh_prevout_share'), + p2wpkh: create_1m1w1y24hBpsPercentRatioPattern(this, 'p2wpkh_prevout_share'), + p2wsh: create_1m1w1y24hBpsPercentRatioPattern(this, 'p2wsh_prevout_share'), + p2tr: create_1m1w1y24hBpsPercentRatioPattern(this, 'p2tr_prevout_share'), + p2a: create_1m1w1y24hBpsPercentRatioPattern(this, 'p2a_prevout_share'), + unknown: create_1m1w1y24hBpsPercentRatioPattern(this, 'unknown_outputs_prevout_share'), + empty: create_1m1w1y24hBpsPercentRatioPattern(this, 'empty_outputs_prevout_share'), + }, + txCount: { + all: createAverageBlockCumulativeSumPattern(this, 'non_coinbase_tx_count'), + p2pk65: createAverageBlockCumulativeSumPattern(this, 'tx_count_with_p2pk65_prevout'), + p2pk33: createAverageBlockCumulativeSumPattern(this, 'tx_count_with_p2pk33_prevout'), + p2pkh: createAverageBlockCumulativeSumPattern(this, 'tx_count_with_p2pkh_prevout'), + p2ms: createAverageBlockCumulativeSumPattern(this, 'tx_count_with_p2ms_prevout'), + p2sh: createAverageBlockCumulativeSumPattern(this, 'tx_count_with_p2sh_prevout'), + p2wpkh: createAverageBlockCumulativeSumPattern(this, 'tx_count_with_p2wpkh_prevout'), + p2wsh: createAverageBlockCumulativeSumPattern(this, 'tx_count_with_p2wsh_prevout'), + p2tr: createAverageBlockCumulativeSumPattern(this, 'tx_count_with_p2tr_prevout'), + p2a: createAverageBlockCumulativeSumPattern(this, 'tx_count_with_p2a_prevout'), + unknown: createAverageBlockCumulativeSumPattern(this, 'tx_count_with_unknown_outputs_prevout'), + empty: createAverageBlockCumulativeSumPattern(this, 'tx_count_with_empty_outputs_prevout'), + }, + txShare: createEmptyP2aP2msP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshUnknownPattern2(this, 'tx_share_with'), + }, + }, + outputs: { + raw: { + firstTxoutIndex: createSeriesPattern18(this, 'first_txout_index'), + value: createSeriesPattern21(this, 'value'), + outputType: createSeriesPattern21(this, 'output_type'), + typeIndex: createSeriesPattern21(this, 'type_index'), + txIndex: createSeriesPattern21(this, 'tx_index'), + }, + spent: { + txinIndex: createSeriesPattern21(this, 'txin_index'), + }, + count: { + total: createCumulativeRollingSumPattern(this, 'output_count'), + }, + perSec: create_1m1w1y24hPattern(this, 'outputs_per_sec'), + unspent: { + count: createSeriesPattern1(this, 'utxo_count_bis'), + }, + byType: { + outputCount: { + all: createAverageBlockCumulativeSumPattern(this, 'output_count_bis'), + p2pk65: createAverageBlockCumulativeSumPattern(this, 'p2pk65_output_count'), + p2pk33: createAverageBlockCumulativeSumPattern(this, 'p2pk33_output_count'), + p2pkh: createAverageBlockCumulativeSumPattern(this, 'p2pkh_output_count'), + p2ms: createAverageBlockCumulativeSumPattern(this, 'p2ms_output_count'), + p2sh: createAverageBlockCumulativeSumPattern(this, 'p2sh_output_count'), + p2wpkh: createAverageBlockCumulativeSumPattern(this, 'p2wpkh_output_count'), + p2wsh: createAverageBlockCumulativeSumPattern(this, 'p2wsh_output_count'), + p2tr: createAverageBlockCumulativeSumPattern(this, 'p2tr_output_count'), + p2a: createAverageBlockCumulativeSumPattern(this, 'p2a_output_count'), + unknown: createAverageBlockCumulativeSumPattern(this, 'unknown_outputs_output_count'), + empty: createAverageBlockCumulativeSumPattern(this, 'empty_outputs_output_count'), + opReturn: createAverageBlockCumulativeSumPattern(this, 'op_return_output_count'), + }, + spendableOutputCount: createAverageBlockCumulativeSumPattern(this, 'spendable_output_count'), + outputShare: { + p2pk65: create_1m1w1y24hBpsPercentRatioPattern(this, 'p2pk65_output_share'), + p2pk33: create_1m1w1y24hBpsPercentRatioPattern(this, 'p2pk33_output_share'), + p2pkh: create_1m1w1y24hBpsPercentRatioPattern(this, 'p2pkh_output_share'), + p2ms: create_1m1w1y24hBpsPercentRatioPattern(this, 'p2ms_output_share'), + p2sh: create_1m1w1y24hBpsPercentRatioPattern(this, 'p2sh_output_share'), + p2wpkh: create_1m1w1y24hBpsPercentRatioPattern(this, 'p2wpkh_output_share'), + p2wsh: create_1m1w1y24hBpsPercentRatioPattern(this, 'p2wsh_output_share'), + p2tr: create_1m1w1y24hBpsPercentRatioPattern(this, 'p2tr_output_share'), + p2a: create_1m1w1y24hBpsPercentRatioPattern(this, 'p2a_output_share'), + unknown: create_1m1w1y24hBpsPercentRatioPattern(this, 'unknown_outputs_output_share'), + empty: create_1m1w1y24hBpsPercentRatioPattern(this, 'empty_outputs_output_share'), + opReturn: create_1m1w1y24hBpsPercentRatioPattern(this, 'op_return_output_share'), + }, + txCount: createAllEmptyOpP2aP2msP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshUnknownPattern(this, 'tx_count'), + txShare: createEmptyOpP2aP2msP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshUnknownPattern2(this, 'tx_share_with'), + }, + value: { + opReturn: createBlockCumulativePattern(this, 'op_return_value'), + }, + }, + addrs: { + raw: { + p2pk65: { + firstIndex: createSeriesPattern18(this, 'first_p2pk65_addr_index'), + bytes: createSeriesPattern27(this, 'p2pk65_bytes'), + }, + p2pk33: { + firstIndex: createSeriesPattern18(this, 'first_p2pk33_addr_index'), + bytes: createSeriesPattern26(this, 'p2pk33_bytes'), + }, + p2pkh: { + firstIndex: createSeriesPattern18(this, 'first_p2pkh_addr_index'), + bytes: createSeriesPattern28(this, 'p2pkh_bytes'), + }, + p2sh: { + firstIndex: createSeriesPattern18(this, 'first_p2sh_addr_index'), + bytes: createSeriesPattern29(this, 'p2sh_bytes'), + }, + p2wpkh: { + firstIndex: createSeriesPattern18(this, 'first_p2wpkh_addr_index'), + bytes: createSeriesPattern31(this, 'p2wpkh_bytes'), + }, + p2wsh: { + firstIndex: createSeriesPattern18(this, 'first_p2wsh_addr_index'), + bytes: createSeriesPattern32(this, 'p2wsh_bytes'), + }, + p2tr: { + firstIndex: createSeriesPattern18(this, 'first_p2tr_addr_index'), + bytes: createSeriesPattern30(this, 'p2tr_bytes'), + }, + p2a: { + firstIndex: createSeriesPattern18(this, 'first_p2a_addr_index'), + bytes: createSeriesPattern24(this, 'p2a_bytes'), + }, + }, + indexes: { + p2a: createSeriesPattern24(this, 'any_addr_index'), + p2pk33: createSeriesPattern26(this, 'any_addr_index'), + p2pk65: createSeriesPattern27(this, 'any_addr_index'), + p2pkh: createSeriesPattern28(this, 'any_addr_index'), + p2sh: createSeriesPattern29(this, 'any_addr_index'), + p2tr: createSeriesPattern30(this, 'any_addr_index'), + p2wpkh: createSeriesPattern31(this, 'any_addr_index'), + p2wsh: createSeriesPattern32(this, 'any_addr_index'), + funded: createSeriesPattern34(this, 'funded_addr_index'), + empty: createSeriesPattern35(this, 'empty_addr_index'), + }, + data: { + funded: createSeriesPattern34(this, 'funded_addr_data'), + empty: createSeriesPattern35(this, 'empty_addr_data'), + }, + funded: createAllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern4(this, 'addr_count'), + empty: createAllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern4(this, 'empty_addr_count'), + activity: { + all: { + reactivated: create_1m1w1y24hBlockPattern(this, 'reactivated_addrs'), + sending: create_1m1w1y24hBlockPattern(this, 'sending_addrs'), + receiving: create_1m1w1y24hBlockPattern(this, 'receiving_addrs'), + bidirectional: create_1m1w1y24hBlockPattern(this, 'bidirectional_addrs'), + active: create_1m1w1y24hBlockPattern(this, 'active_addrs'), + }, + p2pk65: createActiveBidirectionalReactivatedReceivingSendingPattern(this, 'p2pk65'), + p2pk33: createActiveBidirectionalReactivatedReceivingSendingPattern(this, 'p2pk33'), + p2pkh: createActiveBidirectionalReactivatedReceivingSendingPattern(this, 'p2pkh'), + p2sh: createActiveBidirectionalReactivatedReceivingSendingPattern(this, 'p2sh'), + p2wpkh: createActiveBidirectionalReactivatedReceivingSendingPattern(this, 'p2wpkh'), + p2wsh: createActiveBidirectionalReactivatedReceivingSendingPattern(this, 'p2wsh'), + p2tr: createActiveBidirectionalReactivatedReceivingSendingPattern(this, 'p2tr'), + p2a: createActiveBidirectionalReactivatedReceivingSendingPattern(this, 'p2a'), + }, + total: createAllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern4(this, 'total_addr_count'), + new: createAllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern6(this, 'new_addr_count'), + reused: { + count: createFundedTotalPattern(this, 'reused_addr_count'), + events: { + outputToReusedAddrCount: createAllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern6(this, 'output_to_reused_addr_count'), + outputToReusedAddrShare: createAllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern7(this, 'output_to_reused_addr_share'), + spendableOutputToReusedAddrShare: create_1m1w1y24hBpsPercentRatioPattern(this, 'spendable_output_to_reused_addr_share'), + inputFromReusedAddrCount: createAllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern6(this, 'input_from_reused_addr_count'), + inputFromReusedAddrShare: createAllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern7(this, 'input_from_reused_addr_share'), + activeReusedAddrCount: create_1m1w1y24hBlockPattern(this, 'active_reused_addr_count'), + activeReusedAddrShare: create_1m1w1y24hBlockPattern2(this, 'active_reused_addr_share'), + }, + supply: { + all: createBtcCentsSatsUsdPattern(this, 'reused_addr_supply'), + p2pk65: createBtcCentsSatsUsdPattern(this, 'p2pk65_reused_addr_supply'), + p2pk33: createBtcCentsSatsUsdPattern(this, 'p2pk33_reused_addr_supply'), + p2pkh: createBtcCentsSatsUsdPattern(this, 'p2pkh_reused_addr_supply'), + p2sh: createBtcCentsSatsUsdPattern(this, 'p2sh_reused_addr_supply'), + p2wpkh: createBtcCentsSatsUsdPattern(this, 'p2wpkh_reused_addr_supply'), + p2wsh: createBtcCentsSatsUsdPattern(this, 'p2wsh_reused_addr_supply'), + p2tr: createBtcCentsSatsUsdPattern(this, 'p2tr_reused_addr_supply'), + p2a: createBtcCentsSatsUsdPattern(this, 'p2a_reused_addr_supply'), + share: createAllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern5(this, 'reused_addr_supply_share'), + }, + }, + respent: { + count: createFundedTotalPattern(this, 'respent_addr_count'), + events: { + outputToReusedAddrCount: createAllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern6(this, 'output_to_respent_addr_count'), + outputToReusedAddrShare: createAllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern7(this, 'output_to_respent_addr_share'), + spendableOutputToReusedAddrShare: create_1m1w1y24hBpsPercentRatioPattern(this, 'spendable_output_to_respent_addr_share'), + inputFromReusedAddrCount: createAllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern6(this, 'input_from_respent_addr_count'), + inputFromReusedAddrShare: createAllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern7(this, 'input_from_respent_addr_share'), + activeReusedAddrCount: create_1m1w1y24hBlockPattern(this, 'active_respent_addr_count'), + activeReusedAddrShare: create_1m1w1y24hBlockPattern2(this, 'active_respent_addr_share'), + }, + supply: { + all: createBtcCentsSatsUsdPattern(this, 'respent_addr_supply'), + p2pk65: createBtcCentsSatsUsdPattern(this, 'p2pk65_respent_addr_supply'), + p2pk33: createBtcCentsSatsUsdPattern(this, 'p2pk33_respent_addr_supply'), + p2pkh: createBtcCentsSatsUsdPattern(this, 'p2pkh_respent_addr_supply'), + p2sh: createBtcCentsSatsUsdPattern(this, 'p2sh_respent_addr_supply'), + p2wpkh: createBtcCentsSatsUsdPattern(this, 'p2wpkh_respent_addr_supply'), + p2wsh: createBtcCentsSatsUsdPattern(this, 'p2wsh_respent_addr_supply'), + p2tr: createBtcCentsSatsUsdPattern(this, 'p2tr_respent_addr_supply'), + p2a: createBtcCentsSatsUsdPattern(this, 'p2a_respent_addr_supply'), + share: createAllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern5(this, 'respent_addr_supply_share'), + }, + }, + exposed: { + count: createFundedTotalPattern(this, 'exposed_addr_count'), + supply: { + all: createBtcCentsSatsUsdPattern(this, 'exposed_addr_supply'), + p2pk65: createBtcCentsSatsUsdPattern(this, 'p2pk65_exposed_addr_supply'), + p2pk33: createBtcCentsSatsUsdPattern(this, 'p2pk33_exposed_addr_supply'), + p2pkh: createBtcCentsSatsUsdPattern(this, 'p2pkh_exposed_addr_supply'), + p2sh: createBtcCentsSatsUsdPattern(this, 'p2sh_exposed_addr_supply'), + p2wpkh: createBtcCentsSatsUsdPattern(this, 'p2wpkh_exposed_addr_supply'), + p2wsh: createBtcCentsSatsUsdPattern(this, 'p2wsh_exposed_addr_supply'), + p2tr: createBtcCentsSatsUsdPattern(this, 'p2tr_exposed_addr_supply'), + p2a: createBtcCentsSatsUsdPattern(this, 'p2a_exposed_addr_supply'), + share: createAllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern5(this, 'exposed_addr_supply_share'), + }, + }, + delta: { + all: createAbsoluteRatePattern(this, 'addr_count'), + p2pk65: createAbsoluteRatePattern(this, 'p2pk65_addr_count'), + p2pk33: createAbsoluteRatePattern(this, 'p2pk33_addr_count'), + p2pkh: createAbsoluteRatePattern(this, 'p2pkh_addr_count'), + p2sh: createAbsoluteRatePattern(this, 'p2sh_addr_count'), + p2wpkh: createAbsoluteRatePattern(this, 'p2wpkh_addr_count'), + p2wsh: createAbsoluteRatePattern(this, 'p2wsh_addr_count'), + p2tr: createAbsoluteRatePattern(this, 'p2tr_addr_count'), + p2a: createAbsoluteRatePattern(this, 'p2a_addr_count'), + }, + avgAmount: { + all: createAddrUtxoPattern(this, 'avg'), + p2pk65: createAddrUtxoPattern(this, 'p2pk65_avg'), + p2pk33: createAddrUtxoPattern(this, 'p2pk33_avg'), + p2pkh: createAddrUtxoPattern(this, 'p2pkh_avg'), + p2sh: createAddrUtxoPattern(this, 'p2sh_avg'), + p2wpkh: createAddrUtxoPattern(this, 'p2wpkh_avg'), + p2wsh: createAddrUtxoPattern(this, 'p2wsh_avg'), + p2tr: createAddrUtxoPattern(this, 'p2tr_avg'), + p2a: createAddrUtxoPattern(this, 'p2a_avg'), + }, + }, + scripts: { + raw: { + empty: { + firstIndex: createSeriesPattern18(this, 'first_empty_output_index'), + toTxIndex: createSeriesPattern22(this, 'tx_index'), + }, + opReturn: { + firstIndex: createSeriesPattern18(this, 'first_op_return_index'), + toTxIndex: createSeriesPattern23(this, 'tx_index'), + }, + p2ms: { + firstIndex: createSeriesPattern18(this, 'first_p2ms_output_index'), + toTxIndex: createSeriesPattern25(this, 'tx_index'), + }, + unknown: { + firstIndex: createSeriesPattern18(this, 'first_unknown_output_index'), + toTxIndex: createSeriesPattern33(this, 'tx_index'), + }, + }, + }, + mining: { + rewards: { + coinbase: createAverageBlockCumulativeSumPattern3(this, 'coinbase'), + subsidy: { + block: createBtcCentsSatsUsdPattern3(this, 'subsidy'), + cumulative: createBtcCentsSatsUsdPattern(this, 'subsidy_cumulative'), + sum: create_1m1w1y24hPattern4(this, 'subsidy_sum'), + average: create_1m1w1y24hPattern3(this, 'subsidy_average'), + dominance: create_1m1w1y24hBpsPercentRatioPattern(this, 'subsidy_dominance'), + }, + fees: { + block: createBtcCentsSatsUsdPattern3(this, 'fees'), + cumulative: createBtcCentsSatsUsdPattern(this, 'fees_cumulative'), + sum: create_1m1w1y24hPattern4(this, 'fees_sum'), + average: create_1m1w1y24hPattern3(this, 'fees_average'), + min: create_1m1w1y24hPattern4(this, 'fees_min'), + max: create_1m1w1y24hPattern4(this, 'fees_max'), + pct10: create_1m1w1y24hPattern4(this, 'fees_pct10'), + pct25: create_1m1w1y24hPattern4(this, 'fees_pct25'), + median: create_1m1w1y24hPattern4(this, 'fees_median'), + pct75: create_1m1w1y24hPattern4(this, 'fees_pct75'), + pct90: create_1m1w1y24hPattern4(this, 'fees_pct90'), + dominance: create_1m1w1y24hBpsPercentRatioPattern(this, 'fee_dominance'), + toSubsidyRatio: { + _24h: createBpsRatioPattern2(this, 'fee_to_subsidy_ratio_24h'), + _1w: createBpsRatioPattern2(this, 'fee_to_subsidy_ratio_1w'), + _1m: createBpsRatioPattern2(this, 'fee_to_subsidy_ratio_1m'), + _1y: createBpsRatioPattern2(this, 'fee_to_subsidy_ratio_1y'), + }, + }, + outputVolume: createSeriesPattern18(this, 'output_volume'), + unclaimed: createBlockCumulativePattern(this, 'unclaimed_rewards'), + }, + hashrate: { + rate: { + base: createSeriesPattern1(this, 'hash_rate'), + sma: { + _1w: createSeriesPattern1(this, 'hash_rate_sma_1w'), + _1m: createSeriesPattern1(this, 'hash_rate_sma_1m'), + _2m: createSeriesPattern1(this, 'hash_rate_sma_2m'), + _1y: createSeriesPattern1(this, 'hash_rate_sma_1y'), + }, + ath: createSeriesPattern1(this, 'hash_rate_ath'), + drawdown: createBpsPercentRatioPattern5(this, 'hash_rate_drawdown'), + }, + price: createPhsReboundThsPattern(this, 'hash_price'), + value: createPhsReboundThsPattern(this, 'hash_value'), + }, + }, + cointime: { + activity: { + coinblocksCreated: createAverageBlockCumulativeSumPattern(this, 'coinblocks_created'), + coinblocksStored: createAverageBlockCumulativeSumPattern(this, 'coinblocks_stored'), + liveliness: createSeriesPattern1(this, 'liveliness'), + vaultedness: createSeriesPattern1(this, 'vaultedness'), + ratio: createSeriesPattern1(this, 'activity_to_vaultedness'), + coinblocksDestroyed: createAverageBlockCumulativeSumPattern(this, 'coinblocks_destroyed'), + }, + supply: { + vaulted: createBtcCentsSatsUsdPattern(this, 'vaulted_supply'), + active: createBtcCentsSatsUsdPattern(this, 'active_supply'), + }, + value: { + destroyed: createAverageBlockCumulativeSumPattern(this, 'cointime_value_destroyed'), + created: createAverageBlockCumulativeSumPattern(this, 'cointime_value_created'), + stored: createAverageBlockCumulativeSumPattern(this, 'cointime_value_stored'), + vocdd: createAverageBlockCumulativeSumPattern(this, 'vocdd'), + }, + cap: { + thermo: createCentsUsdPattern3(this, 'thermo_cap'), + investor: createCentsUsdPattern3(this, 'investor_cap'), + vaulted: createCentsUsdPattern3(this, 'vaulted_cap'), + active: createCentsUsdPattern3(this, 'active_cap'), + cointime: createCentsUsdPattern3(this, 'cointime_cap'), + aviv: createBpsRatioPattern2(this, 'aviv_ratio'), + }, + prices: { + vaulted: createBpsCentsPercentilesRatioSatsUsdPattern(this, 'vaulted_price'), + active: createBpsCentsPercentilesRatioSatsUsdPattern(this, 'active_price'), + trueMarketMean: createBpsCentsPercentilesRatioSatsUsdPattern(this, 'true_market_mean'), + cointime: createBpsCentsPercentilesRatioSatsUsdPattern(this, 'cointime_price'), + }, + adjusted: { + inflationRate: createBpsPercentRatioPattern(this, 'cointime_adj_inflation_rate'), + txVelocityNative: createSeriesPattern1(this, 'cointime_adj_tx_velocity_btc'), + txVelocityFiat: createSeriesPattern1(this, 'cointime_adj_tx_velocity_usd'), + }, + reserveRisk: { + value: createSeriesPattern1(this, 'reserve_risk'), + vocddMedian1y: createSeriesPattern18(this, 'vocdd_median_1y'), + hodlBank: createSeriesPattern18(this, 'hodl_bank'), + }, + }, + constants: { + _0: createSeriesPattern1(this, 'constant_0'), + _1: createSeriesPattern1(this, 'constant_1'), + _2: createSeriesPattern1(this, 'constant_2'), + _3: createSeriesPattern1(this, 'constant_3'), + _4: createSeriesPattern1(this, 'constant_4'), + _20: createSeriesPattern1(this, 'constant_20'), + _30: createSeriesPattern1(this, 'constant_30'), + _382: createSeriesPattern1(this, 'constant_38_2'), + _50: createSeriesPattern1(this, 'constant_50'), + _618: createSeriesPattern1(this, 'constant_61_8'), + _70: createSeriesPattern1(this, 'constant_70'), + _80: createSeriesPattern1(this, 'constant_80'), + _100: createSeriesPattern1(this, 'constant_100'), + _600: createSeriesPattern1(this, 'constant_600'), + minus1: createSeriesPattern1(this, 'constant_minus_1'), + minus2: createSeriesPattern1(this, 'constant_minus_2'), + minus3: createSeriesPattern1(this, 'constant_minus_3'), + minus4: createSeriesPattern1(this, 'constant_minus_4'), + }, + indexes: { + addr: { + p2pk33: { + identity: createSeriesPattern26(this, 'p2pk33_addr_index'), + addr: createSeriesPattern26(this, 'p2pk33_addr'), + }, + p2pk65: { + identity: createSeriesPattern27(this, 'p2pk65_addr_index'), + addr: createSeriesPattern27(this, 'p2pk65_addr'), + }, + p2pkh: { + identity: createSeriesPattern28(this, 'p2pkh_addr_index'), + addr: createSeriesPattern28(this, 'p2pkh_addr'), + }, + p2sh: { + identity: createSeriesPattern29(this, 'p2sh_addr_index'), + addr: createSeriesPattern29(this, 'p2sh_addr'), + }, + p2tr: { + identity: createSeriesPattern30(this, 'p2tr_addr_index'), + addr: createSeriesPattern30(this, 'p2tr_addr'), + }, + p2wpkh: { + identity: createSeriesPattern31(this, 'p2wpkh_addr_index'), + addr: createSeriesPattern31(this, 'p2wpkh_addr'), + }, + p2wsh: { + identity: createSeriesPattern32(this, 'p2wsh_addr_index'), + addr: createSeriesPattern32(this, 'p2wsh_addr'), + }, + p2a: { + identity: createSeriesPattern24(this, 'p2a_addr_index'), + addr: createSeriesPattern24(this, 'p2a_addr'), + }, + p2ms: { + identity: createSeriesPattern25(this, 'p2ms_output_index'), + }, + empty: { + identity: createSeriesPattern22(this, 'empty_output_index'), + }, + unknown: { + identity: createSeriesPattern33(this, 'unknown_output_index'), + }, + opReturn: { + identity: createSeriesPattern23(this, 'op_return_index'), + }, + }, + height: { + minute10: createSeriesPattern18(this, 'minute10'), + minute30: createSeriesPattern18(this, 'minute30'), + hour1: createSeriesPattern18(this, 'hour1'), + hour4: createSeriesPattern18(this, 'hour4'), + hour12: createSeriesPattern18(this, 'hour12'), + day1: createSeriesPattern18(this, 'day1'), + day3: createSeriesPattern18(this, 'day3'), + epoch: createSeriesPattern18(this, 'epoch'), + halving: createSeriesPattern18(this, 'halving'), + week1: createSeriesPattern18(this, 'week1'), + month1: createSeriesPattern18(this, 'month1'), + month3: createSeriesPattern18(this, 'month3'), + month6: createSeriesPattern18(this, 'month6'), + year1: createSeriesPattern18(this, 'year1'), + year10: createSeriesPattern18(this, 'year10'), + txIndexCount: createSeriesPattern18(this, 'tx_index_count'), + }, + epoch: { + firstHeight: createSeriesPattern17(this, 'first_height'), + }, + halving: { + firstHeight: createSeriesPattern16(this, 'first_height'), + }, + minute10: { + firstHeight: createSeriesPattern3(this, 'first_height'), + }, + minute30: { + firstHeight: createSeriesPattern4(this, 'first_height'), + }, + hour1: { + firstHeight: createSeriesPattern5(this, 'first_height'), + }, + hour4: { + firstHeight: createSeriesPattern6(this, 'first_height'), + }, + hour12: { + firstHeight: createSeriesPattern7(this, 'first_height'), + }, + day1: { + date: createSeriesPattern8(this, 'date'), + firstHeight: createSeriesPattern8(this, 'first_height'), + }, + day3: { + date: createSeriesPattern9(this, 'date'), + firstHeight: createSeriesPattern9(this, 'first_height'), + }, + week1: { + date: createSeriesPattern10(this, 'date'), + firstHeight: createSeriesPattern10(this, 'first_height'), + }, + month1: { + date: createSeriesPattern11(this, 'date'), + firstHeight: createSeriesPattern11(this, 'first_height'), + }, + month3: { + date: createSeriesPattern12(this, 'date'), + firstHeight: createSeriesPattern12(this, 'first_height'), + }, + month6: { + date: createSeriesPattern13(this, 'date'), + firstHeight: createSeriesPattern13(this, 'first_height'), + }, + year1: { + date: createSeriesPattern14(this, 'date'), + firstHeight: createSeriesPattern14(this, 'first_height'), + }, + year10: { + date: createSeriesPattern15(this, 'date'), + firstHeight: createSeriesPattern15(this, 'first_height'), + }, + txIndex: { + identity: createSeriesPattern19(this, 'tx_index'), + inputCount: createSeriesPattern19(this, 'input_count'), + outputCount: createSeriesPattern19(this, 'output_count'), + }, + txinIndex: { + identity: createSeriesPattern20(this, 'txin_index'), + }, + txoutIndex: { + identity: createSeriesPattern21(this, 'txout_index'), + }, + timestamp: { + monotonic: createSeriesPattern18(this, 'timestamp_monotonic'), + resolutions: createSeriesPattern2(this, 'timestamp'), + }, + }, + indicators: { + puellMultiple: createBpsRatioPattern2(this, 'puell_multiple'), + nvt: createBpsRatioPattern2(this, 'nvt'), + gini: createBpsPercentRatioPattern2(this, 'gini'), + rhodlRatio: createBpsRatioPattern2(this, 'rhodl_ratio'), + thermoCapMultiple: createBpsRatioPattern2(this, 'thermo_cap_multiple'), + coindaysDestroyedSupplyAdj: createSeriesPattern1(this, 'coindays_destroyed_supply_adj'), + coinyearsDestroyedSupplyAdj: createSeriesPattern1(this, 'coinyears_destroyed_supply_adj'), + dormancy: { + supplyAdj: createSeriesPattern1(this, 'dormancy_supply_adj'), + flow: createSeriesPattern1(this, 'dormancy_flow'), + }, + stockToFlow: createSeriesPattern1(this, 'stock_to_flow'), + sellerExhaustion: createSeriesPattern1(this, 'seller_exhaustion'), + rarityMeter: { + full: createIndexPct0Pct1Pct2Pct5Pct95Pct98Pct99ScorePattern(this, 'rarity_meter'), + local: createIndexPct0Pct1Pct2Pct5Pct95Pct98Pct99ScorePattern(this, 'local_rarity_meter'), + cycle: createIndexPct0Pct1Pct2Pct5Pct95Pct98Pct99ScorePattern(this, 'cycle_rarity_meter'), + }, + }, + investing: { + satsPerDay: createSeriesPattern18(this, 'dca_sats_per_day'), + period: { + dcaStack: create_10y1m1w1y2y3m3y4y5y6m6y8yPattern3(this, 'dca_stack'), + dcaCostBasis: { + _1w: createCentsSatsUsdPattern(this, 'dca_cost_basis_1w'), + _1m: createCentsSatsUsdPattern(this, 'dca_cost_basis_1m'), + _3m: createCentsSatsUsdPattern(this, 'dca_cost_basis_3m'), + _6m: createCentsSatsUsdPattern(this, 'dca_cost_basis_6m'), + _1y: createCentsSatsUsdPattern(this, 'dca_cost_basis_1y'), + _2y: createCentsSatsUsdPattern(this, 'dca_cost_basis_2y'), + _3y: createCentsSatsUsdPattern(this, 'dca_cost_basis_3y'), + _4y: createCentsSatsUsdPattern(this, 'dca_cost_basis_4y'), + _5y: createCentsSatsUsdPattern(this, 'dca_cost_basis_5y'), + _6y: createCentsSatsUsdPattern(this, 'dca_cost_basis_6y'), + _8y: createCentsSatsUsdPattern(this, 'dca_cost_basis_8y'), + _10y: createCentsSatsUsdPattern(this, 'dca_cost_basis_10y'), + }, + dcaReturn: create_10y1m1w1y2y3m3y4y5y6m6y8yPattern2(this, 'dca_return'), + dcaCagr: create_10y2y3y4y5y6y8yPattern(this, 'dca_cagr'), + lumpSumStack: create_10y1m1w1y2y3m3y4y5y6m6y8yPattern3(this, 'lump_sum_stack'), + lumpSumReturn: create_10y1m1w1y2y3m3y4y5y6m6y8yPattern2(this, 'lump_sum_return'), + }, + class: { + dcaStack: { + from2015: createBtcCentsSatsUsdPattern(this, 'dca_stack_from_2015'), + from2016: createBtcCentsSatsUsdPattern(this, 'dca_stack_from_2016'), + from2017: createBtcCentsSatsUsdPattern(this, 'dca_stack_from_2017'), + from2018: createBtcCentsSatsUsdPattern(this, 'dca_stack_from_2018'), + from2019: createBtcCentsSatsUsdPattern(this, 'dca_stack_from_2019'), + from2020: createBtcCentsSatsUsdPattern(this, 'dca_stack_from_2020'), + from2021: createBtcCentsSatsUsdPattern(this, 'dca_stack_from_2021'), + from2022: createBtcCentsSatsUsdPattern(this, 'dca_stack_from_2022'), + from2023: createBtcCentsSatsUsdPattern(this, 'dca_stack_from_2023'), + from2024: createBtcCentsSatsUsdPattern(this, 'dca_stack_from_2024'), + from2025: createBtcCentsSatsUsdPattern(this, 'dca_stack_from_2025'), + from2026: createBtcCentsSatsUsdPattern(this, 'dca_stack_from_2026'), + }, + dcaCostBasis: { + from2015: createCentsSatsUsdPattern(this, 'dca_cost_basis_from_2015'), + from2016: createCentsSatsUsdPattern(this, 'dca_cost_basis_from_2016'), + from2017: createCentsSatsUsdPattern(this, 'dca_cost_basis_from_2017'), + from2018: createCentsSatsUsdPattern(this, 'dca_cost_basis_from_2018'), + from2019: createCentsSatsUsdPattern(this, 'dca_cost_basis_from_2019'), + from2020: createCentsSatsUsdPattern(this, 'dca_cost_basis_from_2020'), + from2021: createCentsSatsUsdPattern(this, 'dca_cost_basis_from_2021'), + from2022: createCentsSatsUsdPattern(this, 'dca_cost_basis_from_2022'), + from2023: createCentsSatsUsdPattern(this, 'dca_cost_basis_from_2023'), + from2024: createCentsSatsUsdPattern(this, 'dca_cost_basis_from_2024'), + from2025: createCentsSatsUsdPattern(this, 'dca_cost_basis_from_2025'), + from2026: createCentsSatsUsdPattern(this, 'dca_cost_basis_from_2026'), + }, + dcaReturn: { + from2015: createBpsPercentRatioPattern(this, 'dca_return_from_2015'), + from2016: createBpsPercentRatioPattern(this, 'dca_return_from_2016'), + from2017: createBpsPercentRatioPattern(this, 'dca_return_from_2017'), + from2018: createBpsPercentRatioPattern(this, 'dca_return_from_2018'), + from2019: createBpsPercentRatioPattern(this, 'dca_return_from_2019'), + from2020: createBpsPercentRatioPattern(this, 'dca_return_from_2020'), + from2021: createBpsPercentRatioPattern(this, 'dca_return_from_2021'), + from2022: createBpsPercentRatioPattern(this, 'dca_return_from_2022'), + from2023: createBpsPercentRatioPattern(this, 'dca_return_from_2023'), + from2024: createBpsPercentRatioPattern(this, 'dca_return_from_2024'), + from2025: createBpsPercentRatioPattern(this, 'dca_return_from_2025'), + from2026: createBpsPercentRatioPattern(this, 'dca_return_from_2026'), + }, + }, + }, + market: { + ath: { + high: createCentsSatsUsdPattern(this, 'price_ath'), + drawdown: createBpsPercentRatioPattern5(this, 'price_drawdown'), + daysSince: createSeriesPattern1(this, 'days_since_price_ath'), + yearsSince: createSeriesPattern1(this, 'years_since_price_ath'), + maxDaysBetween: createSeriesPattern1(this, 'max_days_between_price_ath'), + maxYearsBetween: createSeriesPattern1(this, 'max_years_between_price_ath'), + }, + lookback: { + _24h: createCentsSatsUsdPattern(this, 'price_past_24h'), + _1w: createCentsSatsUsdPattern(this, 'price_past_1w'), + _1m: createCentsSatsUsdPattern(this, 'price_past_1m'), + _3m: createCentsSatsUsdPattern(this, 'price_past_3m'), + _6m: createCentsSatsUsdPattern(this, 'price_past_6m'), + _1y: createCentsSatsUsdPattern(this, 'price_past_1y'), + _2y: createCentsSatsUsdPattern(this, 'price_past_2y'), + _3y: createCentsSatsUsdPattern(this, 'price_past_3y'), + _4y: createCentsSatsUsdPattern(this, 'price_past_4y'), + _5y: createCentsSatsUsdPattern(this, 'price_past_5y'), + _6y: createCentsSatsUsdPattern(this, 'price_past_6y'), + _8y: createCentsSatsUsdPattern(this, 'price_past_8y'), + _10y: createCentsSatsUsdPattern(this, 'price_past_10y'), + }, + returns: { + periods: { + _24h: createBpsPercentRatioPattern(this, 'price_return_24h'), + _1w: createBpsPercentRatioPattern(this, 'price_return_1w'), + _1m: createBpsPercentRatioPattern(this, 'price_return_1m'), + _3m: createBpsPercentRatioPattern(this, 'price_return_3m'), + _6m: createBpsPercentRatioPattern(this, 'price_return_6m'), + _1y: createBpsPercentRatioPattern(this, 'price_return_1y'), + _2y: createBpsPercentRatioPattern(this, 'price_return_2y'), + _3y: createBpsPercentRatioPattern(this, 'price_return_3y'), + _4y: createBpsPercentRatioPattern(this, 'price_return_4y'), + _5y: createBpsPercentRatioPattern(this, 'price_return_5y'), + _6y: createBpsPercentRatioPattern(this, 'price_return_6y'), + _8y: createBpsPercentRatioPattern(this, 'price_return_8y'), + _10y: createBpsPercentRatioPattern(this, 'price_return_10y'), + }, + cagr: create_10y2y3y4y5y6y8yPattern(this, 'price_cagr'), + sd24h: { + _24h: { + sma: createSeriesPattern1(this, 'price_return_24h_sma_24h'), + sd: createSeriesPattern1(this, 'price_return_24h_sd_24h'), + }, + _1w: { + sma: createSeriesPattern1(this, 'price_return_24h_sma_1w'), + sd: createSeriesPattern1(this, 'price_return_24h_sd_1w'), + }, + _1m: { + sma: createSeriesPattern1(this, 'price_return_24h_sma_1m'), + sd: createSeriesPattern1(this, 'price_return_24h_sd_1m'), + }, + _1y: { + sma: createSeriesPattern1(this, 'price_return_24h_sma_1y'), + sd: createSeriesPattern1(this, 'price_return_24h_sd_1y'), + }, + }, + }, + volatility: create_1m1w1y24hPattern(this, 'price_volatility'), + range: { + min: create_1m1w1y2wPattern(this, 'price_min'), + max: create_1m1w1y2wPattern(this, 'price_max'), + trueRange: createSeriesPattern1(this, 'price_true_range'), + trueRangeSum2w: createSeriesPattern1(this, 'price_true_range_sum_2w'), + choppinessIndex2w: createBpsPercentRatioPattern2(this, 'price_choppiness_index_2w'), + }, + movingAverage: { + sma: { + _1w: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_1w'), + _8d: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_8d'), + _13d: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_13d'), + _21d: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_21d'), + _1m: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_1m'), + _34d: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_34d'), + _55d: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_55d'), + _89d: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_89d'), + _111d: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_111d'), + _144d: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_144d'), + _200d: { + usd: createSeriesPattern1(this, 'price_sma_200d'), + cents: createSeriesPattern1(this, 'price_sma_200d_cents'), + sats: createSeriesPattern1(this, 'price_sma_200d_sats'), + bps: createSeriesPattern1(this, 'price_sma_200d_ratio_bps'), + ratio: createSeriesPattern1(this, 'price_sma_200d_ratio'), + x24: createCentsSatsUsdPattern(this, 'price_sma_200d_x2_4'), + x08: createCentsSatsUsdPattern(this, 'price_sma_200d_x0_8'), + }, + _350d: { + usd: createSeriesPattern1(this, 'price_sma_350d'), + cents: createSeriesPattern1(this, 'price_sma_350d_cents'), + sats: createSeriesPattern1(this, 'price_sma_350d_sats'), + bps: createSeriesPattern1(this, 'price_sma_350d_ratio_bps'), + ratio: createSeriesPattern1(this, 'price_sma_350d_ratio'), + x2: createCentsSatsUsdPattern(this, 'price_sma_350d_x2'), + }, + _1y: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_1y'), + _2y: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_2y'), + _200w: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_200w'), + _4y: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_4y'), + }, + ema: { + _1w: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_1w'), + _8d: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_8d'), + _12d: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_12d'), + _13d: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_13d'), + _21d: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_21d'), + _26d: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_26d'), + _1m: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_1m'), + _34d: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_34d'), + _55d: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_55d'), + _89d: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_89d'), + _144d: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_144d'), + _200d: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_200d'), + _1y: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_1y'), + _2y: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_2y'), + _200w: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_200w'), + _4y: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_4y'), + }, + }, + technical: { + rsi: { + _24h: createRsiStochPattern(this, 'rsi', '24h'), + _1w: createRsiStochPattern(this, 'rsi', '1w'), + _1m: createRsiStochPattern(this, 'rsi', '1m'), + }, + piCycle: createBpsRatioPattern2(this, 'pi_cycle'), + macd: { + _24h: { + emaFast: createSeriesPattern1(this, 'macd_ema_fast_24h'), + emaSlow: createSeriesPattern1(this, 'macd_ema_slow_24h'), + line: createSeriesPattern1(this, 'macd_line_24h'), + signal: createSeriesPattern1(this, 'macd_signal_24h'), + histogram: createSeriesPattern1(this, 'macd_histogram_24h'), + }, + _1w: { + emaFast: createSeriesPattern1(this, 'macd_ema_fast_1w'), + emaSlow: createSeriesPattern1(this, 'macd_ema_slow_1w'), + line: createSeriesPattern1(this, 'macd_line_1w'), + signal: createSeriesPattern1(this, 'macd_signal_1w'), + histogram: createSeriesPattern1(this, 'macd_histogram_1w'), + }, + _1m: { + emaFast: createSeriesPattern1(this, 'macd_ema_fast_1m'), + emaSlow: createSeriesPattern1(this, 'macd_ema_slow_1m'), + line: createSeriesPattern1(this, 'macd_line_1m'), + signal: createSeriesPattern1(this, 'macd_signal_1m'), + histogram: createSeriesPattern1(this, 'macd_histogram_1m'), + }, + }, + }, + }, + pools: { + pool: createSeriesPattern18(this, 'pool'), + major: { + unknown: createBlocksDominanceRewardsPattern(this, 'unknown'), + luxor: createBlocksDominanceRewardsPattern(this, 'luxor'), + btccom: createBlocksDominanceRewardsPattern(this, 'btccom'), + btctop: createBlocksDominanceRewardsPattern(this, 'btctop'), + btcguild: createBlocksDominanceRewardsPattern(this, 'btcguild'), + eligius: createBlocksDominanceRewardsPattern(this, 'eligius'), + f2pool: createBlocksDominanceRewardsPattern(this, 'f2pool'), + braiinspool: createBlocksDominanceRewardsPattern(this, 'braiinspool'), + antpool: createBlocksDominanceRewardsPattern(this, 'antpool'), + btcc: createBlocksDominanceRewardsPattern(this, 'btcc'), + bwpool: createBlocksDominanceRewardsPattern(this, 'bwpool'), + bitfury: createBlocksDominanceRewardsPattern(this, 'bitfury'), + viabtc: createBlocksDominanceRewardsPattern(this, 'viabtc'), + poolin: createBlocksDominanceRewardsPattern(this, 'poolin'), + spiderpool: createBlocksDominanceRewardsPattern(this, 'spiderpool'), + binancepool: createBlocksDominanceRewardsPattern(this, 'binancepool'), + foundryusa: createBlocksDominanceRewardsPattern(this, 'foundryusa'), + sbicrypto: createBlocksDominanceRewardsPattern(this, 'sbicrypto'), + marapool: createBlocksDominanceRewardsPattern(this, 'marapool'), + secpool: createBlocksDominanceRewardsPattern(this, 'secpool'), + ocean: createBlocksDominanceRewardsPattern(this, 'ocean'), + whitepool: createBlocksDominanceRewardsPattern(this, 'whitepool'), + }, + minor: { + blockfills: createBlocksDominancePattern(this, 'blockfills'), + ultimuspool: createBlocksDominancePattern(this, 'ultimuspool'), + terrapool: createBlocksDominancePattern(this, 'terrapool'), + onethash: createBlocksDominancePattern(this, 'onethash'), + bitfarms: createBlocksDominancePattern(this, 'bitfarms'), + huobipool: createBlocksDominancePattern(this, 'huobipool'), + wayicn: createBlocksDominancePattern(this, 'wayicn'), + canoepool: createBlocksDominancePattern(this, 'canoepool'), + bitcoincom: createBlocksDominancePattern(this, 'bitcoincom'), + pool175btc: createBlocksDominancePattern(this, 'pool175btc'), + gbminers: createBlocksDominancePattern(this, 'gbminers'), + axbt: createBlocksDominancePattern(this, 'axbt'), + asicminer: createBlocksDominancePattern(this, 'asicminer'), + bitminter: createBlocksDominancePattern(this, 'bitminter'), + bitcoinrussia: createBlocksDominancePattern(this, 'bitcoinrussia'), + btcserv: createBlocksDominancePattern(this, 'btcserv'), + simplecoinus: createBlocksDominancePattern(this, 'simplecoinus'), + ozcoin: createBlocksDominancePattern(this, 'ozcoin'), + eclipsemc: createBlocksDominancePattern(this, 'eclipsemc'), + maxbtc: createBlocksDominancePattern(this, 'maxbtc'), + triplemining: createBlocksDominancePattern(this, 'triplemining'), + coinlab: createBlocksDominancePattern(this, 'coinlab'), + pool50btc: createBlocksDominancePattern(this, 'pool50btc'), + ghashio: createBlocksDominancePattern(this, 'ghashio'), + stminingcorp: createBlocksDominancePattern(this, 'stminingcorp'), + bitparking: createBlocksDominancePattern(this, 'bitparking'), + mmpool: createBlocksDominancePattern(this, 'mmpool'), + polmine: createBlocksDominancePattern(this, 'polmine'), + kncminer: createBlocksDominancePattern(this, 'kncminer'), + bitalo: createBlocksDominancePattern(this, 'bitalo'), + hhtt: createBlocksDominancePattern(this, 'hhtt'), + megabigpower: createBlocksDominancePattern(this, 'megabigpower'), + mtred: createBlocksDominancePattern(this, 'mtred'), + nmcbit: createBlocksDominancePattern(this, 'nmcbit'), + yourbtcnet: createBlocksDominancePattern(this, 'yourbtcnet'), + givemecoins: createBlocksDominancePattern(this, 'givemecoins'), + multicoinco: createBlocksDominancePattern(this, 'multicoinco'), + bcpoolio: createBlocksDominancePattern(this, 'bcpoolio'), + cointerra: createBlocksDominancePattern(this, 'cointerra'), + kanopool: createBlocksDominancePattern(this, 'kanopool'), + solock: createBlocksDominancePattern(this, 'solock'), + ckpool: createBlocksDominancePattern(this, 'ckpool'), + nicehash: createBlocksDominancePattern(this, 'nicehash'), + bitclub: createBlocksDominancePattern(this, 'bitclub'), + bitcoinaffiliatenetwork: createBlocksDominancePattern(this, 'bitcoinaffiliatenetwork'), + exxbw: createBlocksDominancePattern(this, 'exxbw'), + bitsolo: createBlocksDominancePattern(this, 'bitsolo'), + twentyoneinc: createBlocksDominancePattern(this, 'twentyoneinc'), + digitalbtc: createBlocksDominancePattern(this, 'digitalbtc'), + eightbaochi: createBlocksDominancePattern(this, 'eightbaochi'), + mybtccoinpool: createBlocksDominancePattern(this, 'mybtccoinpool'), + tbdice: createBlocksDominancePattern(this, 'tbdice'), + hashpool: createBlocksDominancePattern(this, 'hashpool'), + nexious: createBlocksDominancePattern(this, 'nexious'), + bravomining: createBlocksDominancePattern(this, 'bravomining'), + hotpool: createBlocksDominancePattern(this, 'hotpool'), + okexpool: createBlocksDominancePattern(this, 'okexpool'), + bcmonster: createBlocksDominancePattern(this, 'bcmonster'), + onehash: createBlocksDominancePattern(this, 'onehash'), + bixin: createBlocksDominancePattern(this, 'bixin'), + tatmaspool: createBlocksDominancePattern(this, 'tatmaspool'), + connectbtc: createBlocksDominancePattern(this, 'connectbtc'), + batpool: createBlocksDominancePattern(this, 'batpool'), + waterhole: createBlocksDominancePattern(this, 'waterhole'), + dcexploration: createBlocksDominancePattern(this, 'dcexploration'), + dcex: createBlocksDominancePattern(this, 'dcex'), + btpool: createBlocksDominancePattern(this, 'btpool'), + fiftyeightcoin: createBlocksDominancePattern(this, 'fiftyeightcoin'), + bitcoinindia: createBlocksDominancePattern(this, 'bitcoinindia'), + shawnp0wers: createBlocksDominancePattern(this, 'shawnp0wers'), + phashio: createBlocksDominancePattern(this, 'phashio'), + rigpool: createBlocksDominancePattern(this, 'rigpool'), + haozhuzhu: createBlocksDominancePattern(this, 'haozhuzhu'), + sevenpool: createBlocksDominancePattern(this, 'sevenpool'), + miningkings: createBlocksDominancePattern(this, 'miningkings'), + hashbx: createBlocksDominancePattern(this, 'hashbx'), + dpool: createBlocksDominancePattern(this, 'dpool'), + rawpool: createBlocksDominancePattern(this, 'rawpool'), + haominer: createBlocksDominancePattern(this, 'haominer'), + helix: createBlocksDominancePattern(this, 'helix'), + bitcoinukraine: createBlocksDominancePattern(this, 'bitcoinukraine'), + secretsuperstar: createBlocksDominancePattern(this, 'secretsuperstar'), + tigerpoolnet: createBlocksDominancePattern(this, 'tigerpoolnet'), + sigmapoolcom: createBlocksDominancePattern(this, 'sigmapoolcom'), + okpooltop: createBlocksDominancePattern(this, 'okpooltop'), + hummerpool: createBlocksDominancePattern(this, 'hummerpool'), + tangpool: createBlocksDominancePattern(this, 'tangpool'), + bytepool: createBlocksDominancePattern(this, 'bytepool'), + novablock: createBlocksDominancePattern(this, 'novablock'), + miningcity: createBlocksDominancePattern(this, 'miningcity'), + minerium: createBlocksDominancePattern(this, 'minerium'), + lubiancom: createBlocksDominancePattern(this, 'lubiancom'), + okkong: createBlocksDominancePattern(this, 'okkong'), + aaopool: createBlocksDominancePattern(this, 'aaopool'), + emcdpool: createBlocksDominancePattern(this, 'emcdpool'), + arkpool: createBlocksDominancePattern(this, 'arkpool'), + purebtccom: createBlocksDominancePattern(this, 'purebtccom'), + kucoinpool: createBlocksDominancePattern(this, 'kucoinpool'), + entrustcharitypool: createBlocksDominancePattern(this, 'entrustcharitypool'), + okminer: createBlocksDominancePattern(this, 'okminer'), + titan: createBlocksDominancePattern(this, 'titan'), + pegapool: createBlocksDominancePattern(this, 'pegapool'), + btcnuggets: createBlocksDominancePattern(this, 'btcnuggets'), + cloudhashing: createBlocksDominancePattern(this, 'cloudhashing'), + digitalxmintsy: createBlocksDominancePattern(this, 'digitalxmintsy'), + telco214: createBlocksDominancePattern(this, 'telco214'), + btcpoolparty: createBlocksDominancePattern(this, 'btcpoolparty'), + multipool: createBlocksDominancePattern(this, 'multipool'), + transactioncoinmining: createBlocksDominancePattern(this, 'transactioncoinmining'), + btcdig: createBlocksDominancePattern(this, 'btcdig'), + trickysbtcpool: createBlocksDominancePattern(this, 'trickysbtcpool'), + btcmp: createBlocksDominancePattern(this, 'btcmp'), + eobot: createBlocksDominancePattern(this, 'eobot'), + unomp: createBlocksDominancePattern(this, 'unomp'), + patels: createBlocksDominancePattern(this, 'patels'), + gogreenlight: createBlocksDominancePattern(this, 'gogreenlight'), + bitcoinindiapool: createBlocksDominancePattern(this, 'bitcoinindiapool'), + ekanembtc: createBlocksDominancePattern(this, 'ekanembtc'), + canoe: createBlocksDominancePattern(this, 'canoe'), + tiger: createBlocksDominancePattern(this, 'tiger'), + onem1x: createBlocksDominancePattern(this, 'onem1x'), + zulupool: createBlocksDominancePattern(this, 'zulupool'), + wiz: createBlocksDominancePattern(this, 'wiz'), + wk057: createBlocksDominancePattern(this, 'wk057'), + futurebitapollosolo: createBlocksDominancePattern(this, 'futurebitapollosolo'), + carbonnegative: createBlocksDominancePattern(this, 'carbonnegative'), + portlandhodl: createBlocksDominancePattern(this, 'portlandhodl'), + phoenix: createBlocksDominancePattern(this, 'phoenix'), + neopool: createBlocksDominancePattern(this, 'neopool'), + maxipool: createBlocksDominancePattern(this, 'maxipool'), + bitfufupool: createBlocksDominancePattern(this, 'bitfufupool'), + gdpool: createBlocksDominancePattern(this, 'gdpool'), + miningdutch: createBlocksDominancePattern(this, 'miningdutch'), + publicpool: createBlocksDominancePattern(this, 'publicpool'), + miningsquared: createBlocksDominancePattern(this, 'miningsquared'), + innopolistech: createBlocksDominancePattern(this, 'innopolistech'), + btclab: createBlocksDominancePattern(this, 'btclab'), + parasite: createBlocksDominancePattern(this, 'parasite'), + redrockpool: createBlocksDominancePattern(this, 'redrockpool'), + est3lar: createBlocksDominancePattern(this, 'est3lar'), + braiinssolo: createBlocksDominancePattern(this, 'braiinssolo'), + solopool: createBlocksDominancePattern(this, 'solopool'), + noderunners: createBlocksDominancePattern(this, 'noderunners'), + }, + }, + prices: { + split: { + open: createCentsSatsUsdPattern3(this, 'price_open'), + high: createCentsSatsUsdPattern3(this, 'price_high'), + low: createCentsSatsUsdPattern3(this, 'price_low'), + close: createCentsSatsUsdPattern3(this, 'price_close'), + }, + ohlc: { + usd: createSeriesPattern2(this, 'price_ohlc'), + cents: createSeriesPattern2(this, 'price_ohlc_cents'), + sats: createSeriesPattern2(this, 'price_ohlc_sats'), + }, + spot: { + usd: createSeriesPattern1(this, 'price'), + cents: createSeriesPattern1(this, 'price_cents'), + sats: createSeriesPattern1(this, 'price_sats'), + }, + }, + supply: { + state: createSeriesPattern18(this, 'supply_state'), + circulating: createBtcCentsSatsUsdPattern(this, 'circulating_supply'), + burned: createBlockCumulativePattern(this, 'unspendable_supply'), + inflationRate: createBpsPercentRatioPattern(this, 'inflation_rate'), + velocity: { + native: createSeriesPattern1(this, 'velocity_btc'), + fiat: createSeriesPattern1(this, 'velocity_usd'), + }, + marketCap: createCentsDeltaUsdPattern(this, 'market_cap'), + marketMinusRealizedCapGrowthRate: create_1m1w1y24hPattern(this, 'market_minus_realized_cap_growth_rate'), + hodledOrLost: createBtcCentsSatsUsdPattern(this, 'hodled_or_lost_supply'), + }, + cohorts: { + utxo: { + all: { + supply: createDeltaDominanceHalfInTotalPattern2(this, 'supply'), + outputs: { + unspentCount: createBaseDeltaPattern(this, 'utxo_count'), + spentCount: createAverageBlockCumulativeSumPattern2(this, 'spent_utxo_count'), + spendingRate: createSeriesPattern1(this, 'spending_rate'), + }, + activity: { + transferVolume: createAverageBlockCumulativeInSumPattern(this, 'transfer_volume'), + coindaysDestroyed: createAverageBlockCumulativeSumPattern(this, 'coindays_destroyed'), + coinyearsDestroyed: createSeriesPattern1(this, 'coinyears_destroyed'), + dormancy: create_1m1w1y24hPattern(this, 'dormancy'), + }, + realized: { + cap: createCentsDeltaToUsdPattern(this, 'realized_cap'), + profit: createBlockCumulativeSumPattern(this, 'realized_profit'), + loss: createBlockCumulativeNegativeSumPattern(this, 'realized_loss'), + price: { + usd: createSeriesPattern1(this, 'realized_price'), + cents: createSeriesPattern1(this, 'realized_price_cents'), + sats: createSeriesPattern1(this, 'realized_price_sats'), + bps: createSeriesPattern1(this, 'realized_price_ratio_bps'), + ratio: createSeriesPattern1(this, 'realized_price_ratio'), + percentiles: createPct0Pct1Pct2Pct5Pct95Pct98Pct99Pattern(this, 'realized_price'), + sma: create_1m1w1y2y4yAllPattern(this, 'realized_price_ratio_sma'), + stdDev: { + all: { + sd: createSeriesPattern1(this, 'realized_price_ratio_sd'), + zscore: createSeriesPattern1(this, 'realized_price_ratio_zscore'), + _0sd: createCentsSatsUsdPattern(this, 'realized_price_0sd'), + p05sd: createPriceRatioPattern(this, 'realized_price', 'p0_5sd'), + p1sd: createPriceRatioPattern(this, 'realized_price', 'p1sd'), + p15sd: createPriceRatioPattern(this, 'realized_price', 'p1_5sd'), + p2sd: createPriceRatioPattern(this, 'realized_price', 'p2sd'), + p25sd: createPriceRatioPattern(this, 'realized_price', 'p2_5sd'), + p3sd: createPriceRatioPattern(this, 'realized_price', 'p3sd'), + m05sd: createPriceRatioPattern(this, 'realized_price', 'm0_5sd'), + m1sd: createPriceRatioPattern(this, 'realized_price', 'm1sd'), + m15sd: createPriceRatioPattern(this, 'realized_price', 'm1_5sd'), + m2sd: createPriceRatioPattern(this, 'realized_price', 'm2sd'), + m25sd: createPriceRatioPattern(this, 'realized_price', 'm2_5sd'), + m3sd: createPriceRatioPattern(this, 'realized_price', 'm3sd'), + }, + _4y: { + sd: createSeriesPattern1(this, 'realized_price_ratio_sd_4y'), + zscore: createSeriesPattern1(this, 'realized_price_ratio_zscore_4y'), + _0sd: createCentsSatsUsdPattern(this, 'realized_price_0sd_4y'), + p05sd: createPriceRatioPattern(this, 'realized_price', 'p0_5sd_4y'), + p1sd: createPriceRatioPattern(this, 'realized_price', 'p1sd_4y'), + p15sd: createPriceRatioPattern(this, 'realized_price', 'p1_5sd_4y'), + p2sd: createPriceRatioPattern(this, 'realized_price', 'p2sd_4y'), + p25sd: createPriceRatioPattern(this, 'realized_price', 'p2_5sd_4y'), + p3sd: createPriceRatioPattern(this, 'realized_price', 'p3sd_4y'), + m05sd: createPriceRatioPattern(this, 'realized_price', 'm0_5sd_4y'), + m1sd: createPriceRatioPattern(this, 'realized_price', 'm1sd_4y'), + m15sd: createPriceRatioPattern(this, 'realized_price', 'm1_5sd_4y'), + m2sd: createPriceRatioPattern(this, 'realized_price', 'm2sd_4y'), + m25sd: createPriceRatioPattern(this, 'realized_price', 'm2_5sd_4y'), + m3sd: createPriceRatioPattern(this, 'realized_price', 'm3sd_4y'), + }, + _2y: { + sd: createSeriesPattern1(this, 'realized_price_ratio_sd_2y'), + zscore: createSeriesPattern1(this, 'realized_price_ratio_zscore_2y'), + _0sd: createCentsSatsUsdPattern(this, 'realized_price_0sd_2y'), + p05sd: createPriceRatioPattern(this, 'realized_price', 'p0_5sd_2y'), + p1sd: createPriceRatioPattern(this, 'realized_price', 'p1sd_2y'), + p15sd: createPriceRatioPattern(this, 'realized_price', 'p1_5sd_2y'), + p2sd: createPriceRatioPattern(this, 'realized_price', 'p2sd_2y'), + p25sd: createPriceRatioPattern(this, 'realized_price', 'p2_5sd_2y'), + p3sd: createPriceRatioPattern(this, 'realized_price', 'p3sd_2y'), + m05sd: createPriceRatioPattern(this, 'realized_price', 'm0_5sd_2y'), + m1sd: createPriceRatioPattern(this, 'realized_price', 'm1sd_2y'), + m15sd: createPriceRatioPattern(this, 'realized_price', 'm1_5sd_2y'), + m2sd: createPriceRatioPattern(this, 'realized_price', 'm2sd_2y'), + m25sd: createPriceRatioPattern(this, 'realized_price', 'm2_5sd_2y'), + m3sd: createPriceRatioPattern(this, 'realized_price', 'm3sd_2y'), + }, + _1y: { + sd: createSeriesPattern1(this, 'realized_price_ratio_sd_1y'), + zscore: createSeriesPattern1(this, 'realized_price_ratio_zscore_1y'), + _0sd: createCentsSatsUsdPattern(this, 'realized_price_0sd_1y'), + p05sd: createPriceRatioPattern(this, 'realized_price', 'p0_5sd_1y'), + p1sd: createPriceRatioPattern(this, 'realized_price', 'p1sd_1y'), + p15sd: createPriceRatioPattern(this, 'realized_price', 'p1_5sd_1y'), + p2sd: createPriceRatioPattern(this, 'realized_price', 'p2sd_1y'), + p25sd: createPriceRatioPattern(this, 'realized_price', 'p2_5sd_1y'), + p3sd: createPriceRatioPattern(this, 'realized_price', 'p3sd_1y'), + m05sd: createPriceRatioPattern(this, 'realized_price', 'm0_5sd_1y'), + m1sd: createPriceRatioPattern(this, 'realized_price', 'm1sd_1y'), + m15sd: createPriceRatioPattern(this, 'realized_price', 'm1_5sd_1y'), + m2sd: createPriceRatioPattern(this, 'realized_price', 'm2sd_1y'), + m25sd: createPriceRatioPattern(this, 'realized_price', 'm2_5sd_1y'), + m3sd: createPriceRatioPattern(this, 'realized_price', 'm3sd_1y'), + }, + }, + }, + mvrv: createSeriesPattern1(this, 'mvrv'), + netPnl: createBlockChangeCumulativeDeltaSumPattern(this, 'net'), + sopr: { + valueDestroyed: createAverageBlockCumulativeSumPattern(this, 'value_destroyed'), + ratio: create_1m1w1y24hPattern(this, 'sopr'), + adjusted: { + ratio: create_1m1w1y24hPattern(this, 'asopr'), + transferVolume: createAverageBlockCumulativeSumPattern(this, 'adj_value_created'), + valueDestroyed: createAverageBlockCumulativeSumPattern(this, 'adj_value_destroyed'), + }, + }, + grossPnl: createBlockCumulativeSumPattern(this, 'realized_gross_pnl'), + sellSideRiskRatio: create_1m1w1y24hPattern8(this, 'sell_side_risk_ratio'), + peakRegret: createBlockCumulativeSumPattern(this, 'realized_peak_regret'), + capitalized: createPricePattern(this, 'capitalized_price'), + profitToLossRatio: create_1m1w1y24hPattern(this, 'realized_profit_to_loss_ratio'), + }, + costBasis: { + inProfit: createPerPattern(this, 'cost_basis_in_profit_per'), + inLoss: createPerPattern(this, 'cost_basis_in_loss_per'), + min: createCentsSatsUsdPattern(this, 'cost_basis_min'), + max: createCentsSatsUsdPattern(this, 'cost_basis_max'), + perCoin: createPct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(this, 'cost_basis_per_coin'), + perDollar: createPct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(this, 'cost_basis_per_dollar'), + supplyDensity: createBpsPercentRatioPattern2(this, 'supply_density'), + }, + unrealized: { + nupl: createBpsRatioPattern(this, 'nupl'), + profit: { + usd: createSeriesPattern1(this, 'unrealized_profit'), + cents: createSeriesPattern1(this, 'unrealized_profit_cents'), + toMcap: createBpsPercentRatioPattern2(this, 'unrealized_profit_to_mcap'), + toOwnGrossPnl: createBpsPercentRatioPattern2(this, 'unrealized_profit_to_own_gross_pnl'), + }, + loss: { + usd: createSeriesPattern1(this, 'unrealized_loss'), + cents: createSeriesPattern1(this, 'unrealized_loss_cents'), + negative: createSeriesPattern1(this, 'unrealized_loss_neg'), + toMcap: createBpsPercentRatioPattern2(this, 'unrealized_loss_to_mcap'), + toOwnGrossPnl: createBpsPercentRatioPattern2(this, 'unrealized_loss_to_own_gross_pnl'), + }, + netPnl: { + usd: createSeriesPattern1(this, 'net_unrealized_pnl'), + cents: createSeriesPattern1(this, 'net_unrealized_pnl_cents'), + toOwnGrossPnl: createBpsPercentRatioPattern(this, 'net_unrealized_pnl_to_own_gross_pnl'), + }, + grossPnl: createCentsUsdPattern3(this, 'unrealized_gross_pnl'), + investedCapital: createInPattern2(this, 'invested_capital_in'), + capitalizedCapInProfitRaw: createSeriesPattern18(this, 'capitalized_cap_in_profit_raw'), + capitalizedCapInLossRaw: createSeriesPattern18(this, 'capitalized_cap_in_loss_raw'), + sentiment: { + painIndex: createCentsUsdPattern3(this, 'pain_index'), + greedIndex: createCentsUsdPattern3(this, 'greed_index'), + net: createCentsUsdPattern(this, 'net_sentiment'), + }, + }, + investedCapital: createInPattern(this, 'invested_capital_in'), + }, + sth: { + supply: createDeltaDominanceHalfInTotalPattern2(this, 'sth_supply'), + outputs: createSpendingSpentUnspentPattern(this, 'sth'), + activity: createCoindaysCoinyearsDormancyTransferPattern(this, 'sth'), + realized: { + cap: createCentsDeltaToUsdPattern(this, 'sth_realized_cap'), + profit: createBlockCumulativeSumPattern(this, 'sth_realized_profit'), + loss: createBlockCumulativeNegativeSumPattern(this, 'sth_realized_loss'), + price: { + usd: createSeriesPattern1(this, 'sth_realized_price'), + cents: createSeriesPattern1(this, 'sth_realized_price_cents'), + sats: createSeriesPattern1(this, 'sth_realized_price_sats'), + bps: createSeriesPattern1(this, 'sth_realized_price_ratio_bps'), + ratio: createSeriesPattern1(this, 'sth_realized_price_ratio'), + percentiles: createPct0Pct1Pct2Pct5Pct95Pct98Pct99Pattern(this, 'sth_realized_price'), + sma: create_1m1w1y2y4yAllPattern(this, 'sth_realized_price_ratio_sma'), + stdDev: { + all: { + sd: createSeriesPattern1(this, 'sth_realized_price_ratio_sd'), + zscore: createSeriesPattern1(this, 'sth_realized_price_ratio_zscore'), + _0sd: createCentsSatsUsdPattern(this, 'sth_realized_price_0sd'), + p05sd: createPriceRatioPattern(this, 'sth_realized_price', 'p0_5sd'), + p1sd: createPriceRatioPattern(this, 'sth_realized_price', 'p1sd'), + p15sd: createPriceRatioPattern(this, 'sth_realized_price', 'p1_5sd'), + p2sd: createPriceRatioPattern(this, 'sth_realized_price', 'p2sd'), + p25sd: createPriceRatioPattern(this, 'sth_realized_price', 'p2_5sd'), + p3sd: createPriceRatioPattern(this, 'sth_realized_price', 'p3sd'), + m05sd: createPriceRatioPattern(this, 'sth_realized_price', 'm0_5sd'), + m1sd: createPriceRatioPattern(this, 'sth_realized_price', 'm1sd'), + m15sd: createPriceRatioPattern(this, 'sth_realized_price', 'm1_5sd'), + m2sd: createPriceRatioPattern(this, 'sth_realized_price', 'm2sd'), + m25sd: createPriceRatioPattern(this, 'sth_realized_price', 'm2_5sd'), + m3sd: createPriceRatioPattern(this, 'sth_realized_price', 'm3sd'), + }, + _4y: { + sd: createSeriesPattern1(this, 'sth_realized_price_ratio_sd_4y'), + zscore: createSeriesPattern1(this, 'sth_realized_price_ratio_zscore_4y'), + _0sd: createCentsSatsUsdPattern(this, 'sth_realized_price_0sd_4y'), + p05sd: createPriceRatioPattern(this, 'sth_realized_price', 'p0_5sd_4y'), + p1sd: createPriceRatioPattern(this, 'sth_realized_price', 'p1sd_4y'), + p15sd: createPriceRatioPattern(this, 'sth_realized_price', 'p1_5sd_4y'), + p2sd: createPriceRatioPattern(this, 'sth_realized_price', 'p2sd_4y'), + p25sd: createPriceRatioPattern(this, 'sth_realized_price', 'p2_5sd_4y'), + p3sd: createPriceRatioPattern(this, 'sth_realized_price', 'p3sd_4y'), + m05sd: createPriceRatioPattern(this, 'sth_realized_price', 'm0_5sd_4y'), + m1sd: createPriceRatioPattern(this, 'sth_realized_price', 'm1sd_4y'), + m15sd: createPriceRatioPattern(this, 'sth_realized_price', 'm1_5sd_4y'), + m2sd: createPriceRatioPattern(this, 'sth_realized_price', 'm2sd_4y'), + m25sd: createPriceRatioPattern(this, 'sth_realized_price', 'm2_5sd_4y'), + m3sd: createPriceRatioPattern(this, 'sth_realized_price', 'm3sd_4y'), + }, + _2y: { + sd: createSeriesPattern1(this, 'sth_realized_price_ratio_sd_2y'), + zscore: createSeriesPattern1(this, 'sth_realized_price_ratio_zscore_2y'), + _0sd: createCentsSatsUsdPattern(this, 'sth_realized_price_0sd_2y'), + p05sd: createPriceRatioPattern(this, 'sth_realized_price', 'p0_5sd_2y'), + p1sd: createPriceRatioPattern(this, 'sth_realized_price', 'p1sd_2y'), + p15sd: createPriceRatioPattern(this, 'sth_realized_price', 'p1_5sd_2y'), + p2sd: createPriceRatioPattern(this, 'sth_realized_price', 'p2sd_2y'), + p25sd: createPriceRatioPattern(this, 'sth_realized_price', 'p2_5sd_2y'), + p3sd: createPriceRatioPattern(this, 'sth_realized_price', 'p3sd_2y'), + m05sd: createPriceRatioPattern(this, 'sth_realized_price', 'm0_5sd_2y'), + m1sd: createPriceRatioPattern(this, 'sth_realized_price', 'm1sd_2y'), + m15sd: createPriceRatioPattern(this, 'sth_realized_price', 'm1_5sd_2y'), + m2sd: createPriceRatioPattern(this, 'sth_realized_price', 'm2sd_2y'), + m25sd: createPriceRatioPattern(this, 'sth_realized_price', 'm2_5sd_2y'), + m3sd: createPriceRatioPattern(this, 'sth_realized_price', 'm3sd_2y'), + }, + _1y: { + sd: createSeriesPattern1(this, 'sth_realized_price_ratio_sd_1y'), + zscore: createSeriesPattern1(this, 'sth_realized_price_ratio_zscore_1y'), + _0sd: createCentsSatsUsdPattern(this, 'sth_realized_price_0sd_1y'), + p05sd: createPriceRatioPattern(this, 'sth_realized_price', 'p0_5sd_1y'), + p1sd: createPriceRatioPattern(this, 'sth_realized_price', 'p1sd_1y'), + p15sd: createPriceRatioPattern(this, 'sth_realized_price', 'p1_5sd_1y'), + p2sd: createPriceRatioPattern(this, 'sth_realized_price', 'p2sd_1y'), + p25sd: createPriceRatioPattern(this, 'sth_realized_price', 'p2_5sd_1y'), + p3sd: createPriceRatioPattern(this, 'sth_realized_price', 'p3sd_1y'), + m05sd: createPriceRatioPattern(this, 'sth_realized_price', 'm0_5sd_1y'), + m1sd: createPriceRatioPattern(this, 'sth_realized_price', 'm1sd_1y'), + m15sd: createPriceRatioPattern(this, 'sth_realized_price', 'm1_5sd_1y'), + m2sd: createPriceRatioPattern(this, 'sth_realized_price', 'm2sd_1y'), + m25sd: createPriceRatioPattern(this, 'sth_realized_price', 'm2_5sd_1y'), + m3sd: createPriceRatioPattern(this, 'sth_realized_price', 'm3sd_1y'), + }, + }, + }, + mvrv: createSeriesPattern1(this, 'sth_mvrv'), + netPnl: createBlockChangeCumulativeDeltaSumPattern(this, 'sth_net'), + sopr: createAdjustedRatioValuePattern(this, 'sth'), + grossPnl: createBlockCumulativeSumPattern(this, 'sth_realized_gross_pnl'), + sellSideRiskRatio: create_1m1w1y24hPattern8(this, 'sth_sell_side_risk_ratio'), + peakRegret: createBlockCumulativeSumPattern(this, 'sth_realized_peak_regret'), + capitalized: createPricePattern(this, 'sth_capitalized_price'), + profitToLossRatio: create_1m1w1y24hPattern(this, 'sth_realized_profit_to_loss_ratio'), + }, + costBasis: createInMaxMinPerSupplyPattern(this, 'sth'), + unrealized: createCapitalizedGrossInvestedLossNetNuplProfitSentimentPattern2(this, 'sth'), + investedCapital: createInPattern(this, 'sth_invested_capital_in'), + }, + lth: { + supply: createDeltaDominanceHalfInTotalPattern2(this, 'lth_supply'), + outputs: createSpendingSpentUnspentPattern(this, 'lth'), + activity: createCoindaysCoinyearsDormancyTransferPattern(this, 'lth'), + realized: { + cap: createCentsDeltaToUsdPattern(this, 'lth_realized_cap'), + profit: createBlockCumulativeSumPattern(this, 'lth_realized_profit'), + loss: createBlockCumulativeNegativeSumPattern(this, 'lth_realized_loss'), + price: { + usd: createSeriesPattern1(this, 'lth_realized_price'), + cents: createSeriesPattern1(this, 'lth_realized_price_cents'), + sats: createSeriesPattern1(this, 'lth_realized_price_sats'), + bps: createSeriesPattern1(this, 'lth_realized_price_ratio_bps'), + ratio: createSeriesPattern1(this, 'lth_realized_price_ratio'), + percentiles: createPct0Pct1Pct2Pct5Pct95Pct98Pct99Pattern(this, 'lth_realized_price'), + sma: create_1m1w1y2y4yAllPattern(this, 'lth_realized_price_ratio_sma'), + stdDev: { + all: { + sd: createSeriesPattern1(this, 'lth_realized_price_ratio_sd'), + zscore: createSeriesPattern1(this, 'lth_realized_price_ratio_zscore'), + _0sd: createCentsSatsUsdPattern(this, 'lth_realized_price_0sd'), + p05sd: createPriceRatioPattern(this, 'lth_realized_price', 'p0_5sd'), + p1sd: createPriceRatioPattern(this, 'lth_realized_price', 'p1sd'), + p15sd: createPriceRatioPattern(this, 'lth_realized_price', 'p1_5sd'), + p2sd: createPriceRatioPattern(this, 'lth_realized_price', 'p2sd'), + p25sd: createPriceRatioPattern(this, 'lth_realized_price', 'p2_5sd'), + p3sd: createPriceRatioPattern(this, 'lth_realized_price', 'p3sd'), + m05sd: createPriceRatioPattern(this, 'lth_realized_price', 'm0_5sd'), + m1sd: createPriceRatioPattern(this, 'lth_realized_price', 'm1sd'), + m15sd: createPriceRatioPattern(this, 'lth_realized_price', 'm1_5sd'), + m2sd: createPriceRatioPattern(this, 'lth_realized_price', 'm2sd'), + m25sd: createPriceRatioPattern(this, 'lth_realized_price', 'm2_5sd'), + m3sd: createPriceRatioPattern(this, 'lth_realized_price', 'm3sd'), + }, + _4y: { + sd: createSeriesPattern1(this, 'lth_realized_price_ratio_sd_4y'), + zscore: createSeriesPattern1(this, 'lth_realized_price_ratio_zscore_4y'), + _0sd: createCentsSatsUsdPattern(this, 'lth_realized_price_0sd_4y'), + p05sd: createPriceRatioPattern(this, 'lth_realized_price', 'p0_5sd_4y'), + p1sd: createPriceRatioPattern(this, 'lth_realized_price', 'p1sd_4y'), + p15sd: createPriceRatioPattern(this, 'lth_realized_price', 'p1_5sd_4y'), + p2sd: createPriceRatioPattern(this, 'lth_realized_price', 'p2sd_4y'), + p25sd: createPriceRatioPattern(this, 'lth_realized_price', 'p2_5sd_4y'), + p3sd: createPriceRatioPattern(this, 'lth_realized_price', 'p3sd_4y'), + m05sd: createPriceRatioPattern(this, 'lth_realized_price', 'm0_5sd_4y'), + m1sd: createPriceRatioPattern(this, 'lth_realized_price', 'm1sd_4y'), + m15sd: createPriceRatioPattern(this, 'lth_realized_price', 'm1_5sd_4y'), + m2sd: createPriceRatioPattern(this, 'lth_realized_price', 'm2sd_4y'), + m25sd: createPriceRatioPattern(this, 'lth_realized_price', 'm2_5sd_4y'), + m3sd: createPriceRatioPattern(this, 'lth_realized_price', 'm3sd_4y'), + }, + _2y: { + sd: createSeriesPattern1(this, 'lth_realized_price_ratio_sd_2y'), + zscore: createSeriesPattern1(this, 'lth_realized_price_ratio_zscore_2y'), + _0sd: createCentsSatsUsdPattern(this, 'lth_realized_price_0sd_2y'), + p05sd: createPriceRatioPattern(this, 'lth_realized_price', 'p0_5sd_2y'), + p1sd: createPriceRatioPattern(this, 'lth_realized_price', 'p1sd_2y'), + p15sd: createPriceRatioPattern(this, 'lth_realized_price', 'p1_5sd_2y'), + p2sd: createPriceRatioPattern(this, 'lth_realized_price', 'p2sd_2y'), + p25sd: createPriceRatioPattern(this, 'lth_realized_price', 'p2_5sd_2y'), + p3sd: createPriceRatioPattern(this, 'lth_realized_price', 'p3sd_2y'), + m05sd: createPriceRatioPattern(this, 'lth_realized_price', 'm0_5sd_2y'), + m1sd: createPriceRatioPattern(this, 'lth_realized_price', 'm1sd_2y'), + m15sd: createPriceRatioPattern(this, 'lth_realized_price', 'm1_5sd_2y'), + m2sd: createPriceRatioPattern(this, 'lth_realized_price', 'm2sd_2y'), + m25sd: createPriceRatioPattern(this, 'lth_realized_price', 'm2_5sd_2y'), + m3sd: createPriceRatioPattern(this, 'lth_realized_price', 'm3sd_2y'), + }, + _1y: { + sd: createSeriesPattern1(this, 'lth_realized_price_ratio_sd_1y'), + zscore: createSeriesPattern1(this, 'lth_realized_price_ratio_zscore_1y'), + _0sd: createCentsSatsUsdPattern(this, 'lth_realized_price_0sd_1y'), + p05sd: createPriceRatioPattern(this, 'lth_realized_price', 'p0_5sd_1y'), + p1sd: createPriceRatioPattern(this, 'lth_realized_price', 'p1sd_1y'), + p15sd: createPriceRatioPattern(this, 'lth_realized_price', 'p1_5sd_1y'), + p2sd: createPriceRatioPattern(this, 'lth_realized_price', 'p2sd_1y'), + p25sd: createPriceRatioPattern(this, 'lth_realized_price', 'p2_5sd_1y'), + p3sd: createPriceRatioPattern(this, 'lth_realized_price', 'p3sd_1y'), + m05sd: createPriceRatioPattern(this, 'lth_realized_price', 'm0_5sd_1y'), + m1sd: createPriceRatioPattern(this, 'lth_realized_price', 'm1sd_1y'), + m15sd: createPriceRatioPattern(this, 'lth_realized_price', 'm1_5sd_1y'), + m2sd: createPriceRatioPattern(this, 'lth_realized_price', 'm2sd_1y'), + m25sd: createPriceRatioPattern(this, 'lth_realized_price', 'm2_5sd_1y'), + m3sd: createPriceRatioPattern(this, 'lth_realized_price', 'm3sd_1y'), + }, + }, + }, + mvrv: createSeriesPattern1(this, 'lth_mvrv'), + netPnl: createBlockChangeCumulativeDeltaSumPattern(this, 'lth_net'), + sopr: { + valueDestroyed: createAverageBlockCumulativeSumPattern(this, 'lth_value_destroyed'), + ratio: create_1m1w1y24hPattern(this, 'lth_sopr'), + }, + grossPnl: createBlockCumulativeSumPattern(this, 'lth_realized_gross_pnl'), + sellSideRiskRatio: create_1m1w1y24hPattern8(this, 'lth_sell_side_risk_ratio'), + peakRegret: createBlockCumulativeSumPattern(this, 'lth_realized_peak_regret'), + capitalized: createPricePattern(this, 'lth_capitalized_price'), + profitToLossRatio: create_1m1w1y24hPattern(this, 'lth_realized_profit_to_loss_ratio'), + }, + costBasis: createInMaxMinPerSupplyPattern(this, 'lth'), + unrealized: createCapitalizedGrossInvestedLossNetNuplProfitSentimentPattern2(this, 'lth'), + investedCapital: createInPattern(this, 'lth_invested_capital_in'), + }, + ageRange: { + under1h: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_1h_old'), + _1hTo1d: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_1h_to_1d_old'), + _1dTo1w: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_1d_to_1w_old'), + _1wTo1m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_1w_to_1m_old'), + _1mTo2m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_1m_to_2m_old'), + _2mTo3m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_2m_to_3m_old'), + _3mTo4m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_3m_to_4m_old'), + _4mTo5m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_4m_to_5m_old'), + _5mTo6m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_5m_to_6m_old'), + _6mTo1y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_6m_to_1y_old'), + _1yTo2y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_1y_to_2y_old'), + _2yTo3y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_2y_to_3y_old'), + _3yTo4y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_3y_to_4y_old'), + _4yTo5y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_4y_to_5y_old'), + _5yTo6y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_5y_to_6y_old'), + _6yTo7y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_6y_to_7y_old'), + _7yTo8y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_7y_to_8y_old'), + _8yTo10y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_8y_to_10y_old'), + _10yTo12y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_10y_to_12y_old'), + _12yTo15y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_12y_to_15y_old'), + over15y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_15y_old'), + }, + underAge: { + _1w: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_1w_old'), + _1m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_1m_old'), + _2m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_2m_old'), + _3m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_3m_old'), + _4m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_4m_old'), + _5m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_5m_old'), + _6m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_6m_old'), + _1y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_1y_old'), + _2y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_2y_old'), + _3y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_3y_old'), + _4y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_4y_old'), + _5y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_5y_old'), + _6y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_6y_old'), + _7y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_7y_old'), + _8y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_8y_old'), + _10y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_10y_old'), + _12y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_12y_old'), + _15y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_15y_old'), + }, + overAge: { + _1d: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_1d_old'), + _1w: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_1w_old'), + _1m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_1m_old'), + _2m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_2m_old'), + _3m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_3m_old'), + _4m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_4m_old'), + _5m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_5m_old'), + _6m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_6m_old'), + _1y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_1y_old'), + _2y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_2y_old'), + _3y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_3y_old'), + _4y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_4y_old'), + _5y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_5y_old'), + _6y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_6y_old'), + _7y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_7y_old'), + _8y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_8y_old'), + _10y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_10y_old'), + _12y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_12y_old'), + }, + epoch: { + _0: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'epoch_0'), + _1: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'epoch_1'), + _2: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'epoch_2'), + _3: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'epoch_3'), + _4: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'epoch_4'), + }, + class: { + _2009: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2009'), + _2010: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2010'), + _2011: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2011'), + _2012: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2012'), + _2013: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2013'), + _2014: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2014'), + _2015: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2015'), + _2016: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2016'), + _2017: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2017'), + _2018: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2018'), + _2019: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2019'), + _2020: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2020'), + _2021: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2021'), + _2022: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2022'), + _2023: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2023'), + _2024: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2024'), + _2025: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2025'), + _2026: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2026'), + }, + overAmount: { + _1sat: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_1sat'), + _10sats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_10sats'), + _100sats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_100sats'), + _1kSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_1k_sats'), + _10kSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_10k_sats'), + _100kSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_100k_sats'), + _1mSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_1m_sats'), + _10mSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_10m_sats'), + _1btc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_1btc'), + _10btc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_10btc'), + _100btc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_100btc'), + _1kBtc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_1k_btc'), + _10kBtc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_10k_btc'), + }, + amountRange: { + _0sats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_0sats'), + _1satTo10sats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_1sat_to_10sats'), + _10satsTo100sats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_10sats_to_100sats'), + _100satsTo1kSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_100sats_to_1k_sats'), + _1kSatsTo10kSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_1k_sats_to_10k_sats'), + _10kSatsTo100kSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_10k_sats_to_100k_sats'), + _100kSatsTo1mSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_100k_sats_to_1m_sats'), + _1mSatsTo10mSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_1m_sats_to_10m_sats'), + _10mSatsTo1btc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_10m_sats_to_1btc'), + _1btcTo10btc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_1btc_to_10btc'), + _10btcTo100btc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_10btc_to_100btc'), + _100btcTo1kBtc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_100btc_to_1k_btc'), + _1kBtcTo10kBtc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_1k_btc_to_10k_btc'), + _10kBtcTo100kBtc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_10k_btc_to_100k_btc'), + over100kBtc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_100k_btc'), + }, + underAmount: { + _10sats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_10sats'), + _100sats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_100sats'), + _1kSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_1k_sats'), + _10kSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_10k_sats'), + _100kSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_100k_sats'), + _1mSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_1m_sats'), + _10mSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_10m_sats'), + _1btc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_1btc'), + _10btc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_10btc'), + _100btc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_100btc'), + _1kBtc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_1k_btc'), + _10kBtc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_10k_btc'), + _100kBtc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_100k_btc'), + }, + type: { + p2pk65: createActivityOutputsRealizedSupplyUnrealizedPattern3(this, 'p2pk65'), + p2pk33: createActivityOutputsRealizedSupplyUnrealizedPattern3(this, 'p2pk33'), + p2pkh: createActivityOutputsRealizedSupplyUnrealizedPattern3(this, 'p2pkh'), + p2ms: createActivityOutputsRealizedSupplyUnrealizedPattern3(this, 'p2ms'), + p2sh: createActivityOutputsRealizedSupplyUnrealizedPattern3(this, 'p2sh'), + p2wpkh: createActivityOutputsRealizedSupplyUnrealizedPattern3(this, 'p2wpkh'), + p2wsh: createActivityOutputsRealizedSupplyUnrealizedPattern3(this, 'p2wsh'), + p2tr: createActivityOutputsRealizedSupplyUnrealizedPattern3(this, 'p2tr'), + p2a: createActivityOutputsRealizedSupplyUnrealizedPattern3(this, 'p2a'), + unknown: createActivityOutputsRealizedSupplyUnrealizedPattern3(this, 'unknown_outputs'), + empty: createActivityOutputsRealizedSupplyUnrealizedPattern3(this, 'empty_outputs'), + }, + profitability: { + range: { + over1000pctInProfit: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_over_1000pct_in_profit'), + _500pctTo1000pctInProfit: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_500pct_to_1000pct_in_profit'), + _300pctTo500pctInProfit: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_300pct_to_500pct_in_profit'), + _200pctTo300pctInProfit: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_200pct_to_300pct_in_profit'), + _100pctTo200pctInProfit: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_100pct_to_200pct_in_profit'), + _90pctTo100pctInProfit: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_90pct_to_100pct_in_profit'), + _80pctTo90pctInProfit: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_80pct_to_90pct_in_profit'), + _70pctTo80pctInProfit: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_70pct_to_80pct_in_profit'), + _60pctTo70pctInProfit: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_60pct_to_70pct_in_profit'), + _50pctTo60pctInProfit: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_50pct_to_60pct_in_profit'), + _40pctTo50pctInProfit: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_40pct_to_50pct_in_profit'), + _30pctTo40pctInProfit: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_30pct_to_40pct_in_profit'), + _20pctTo30pctInProfit: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_20pct_to_30pct_in_profit'), + _10pctTo20pctInProfit: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_10pct_to_20pct_in_profit'), + _0pctTo10pctInProfit: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_0pct_to_10pct_in_profit'), + _0pctTo10pctInLoss: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_0pct_to_10pct_in_loss'), + _10pctTo20pctInLoss: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_10pct_to_20pct_in_loss'), + _20pctTo30pctInLoss: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_20pct_to_30pct_in_loss'), + _30pctTo40pctInLoss: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_30pct_to_40pct_in_loss'), + _40pctTo50pctInLoss: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_40pct_to_50pct_in_loss'), + _50pctTo60pctInLoss: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_50pct_to_60pct_in_loss'), + _60pctTo70pctInLoss: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_60pct_to_70pct_in_loss'), + _70pctTo80pctInLoss: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_70pct_to_80pct_in_loss'), + _80pctTo90pctInLoss: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_80pct_to_90pct_in_loss'), + _90pctTo100pctInLoss: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_90pct_to_100pct_in_loss'), + }, + profit: { + all: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_in_profit'), + _10pct: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_over_10pct_in_profit'), + _20pct: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_over_20pct_in_profit'), + _30pct: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_over_30pct_in_profit'), + _40pct: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_over_40pct_in_profit'), + _50pct: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_over_50pct_in_profit'), + _60pct: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_over_60pct_in_profit'), + _70pct: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_over_70pct_in_profit'), + _80pct: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_over_80pct_in_profit'), + _90pct: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_over_90pct_in_profit'), + _100pct: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_over_100pct_in_profit'), + _200pct: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_over_200pct_in_profit'), + _300pct: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_over_300pct_in_profit'), + _500pct: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_over_500pct_in_profit'), + }, + loss: { + all: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_in_loss'), + _10pct: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_over_10pct_in_loss'), + _20pct: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_over_20pct_in_loss'), + _30pct: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_over_30pct_in_loss'), + _40pct: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_over_40pct_in_loss'), + _50pct: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_over_50pct_in_loss'), + _60pct: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_over_60pct_in_loss'), + _70pct: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_over_70pct_in_loss'), + _80pct: createNuplRealizedSupplyUnrealizedPattern(this, 'utxos_over_80pct_in_loss'), + }, + }, + matured: { + under1h: createAverageBlockCumulativeSumPattern3(this, 'utxos_under_1h_old_matured_supply'), + _1hTo1d: createAverageBlockCumulativeSumPattern3(this, 'utxos_1h_to_1d_old_matured_supply'), + _1dTo1w: createAverageBlockCumulativeSumPattern3(this, 'utxos_1d_to_1w_old_matured_supply'), + _1wTo1m: createAverageBlockCumulativeSumPattern3(this, 'utxos_1w_to_1m_old_matured_supply'), + _1mTo2m: createAverageBlockCumulativeSumPattern3(this, 'utxos_1m_to_2m_old_matured_supply'), + _2mTo3m: createAverageBlockCumulativeSumPattern3(this, 'utxos_2m_to_3m_old_matured_supply'), + _3mTo4m: createAverageBlockCumulativeSumPattern3(this, 'utxos_3m_to_4m_old_matured_supply'), + _4mTo5m: createAverageBlockCumulativeSumPattern3(this, 'utxos_4m_to_5m_old_matured_supply'), + _5mTo6m: createAverageBlockCumulativeSumPattern3(this, 'utxos_5m_to_6m_old_matured_supply'), + _6mTo1y: createAverageBlockCumulativeSumPattern3(this, 'utxos_6m_to_1y_old_matured_supply'), + _1yTo2y: createAverageBlockCumulativeSumPattern3(this, 'utxos_1y_to_2y_old_matured_supply'), + _2yTo3y: createAverageBlockCumulativeSumPattern3(this, 'utxos_2y_to_3y_old_matured_supply'), + _3yTo4y: createAverageBlockCumulativeSumPattern3(this, 'utxos_3y_to_4y_old_matured_supply'), + _4yTo5y: createAverageBlockCumulativeSumPattern3(this, 'utxos_4y_to_5y_old_matured_supply'), + _5yTo6y: createAverageBlockCumulativeSumPattern3(this, 'utxos_5y_to_6y_old_matured_supply'), + _6yTo7y: createAverageBlockCumulativeSumPattern3(this, 'utxos_6y_to_7y_old_matured_supply'), + _7yTo8y: createAverageBlockCumulativeSumPattern3(this, 'utxos_7y_to_8y_old_matured_supply'), + _8yTo10y: createAverageBlockCumulativeSumPattern3(this, 'utxos_8y_to_10y_old_matured_supply'), + _10yTo12y: createAverageBlockCumulativeSumPattern3(this, 'utxos_10y_to_12y_old_matured_supply'), + _12yTo15y: createAverageBlockCumulativeSumPattern3(this, 'utxos_12y_to_15y_old_matured_supply'), + over15y: createAverageBlockCumulativeSumPattern3(this, 'utxos_over_15y_old_matured_supply'), + }, + }, + addr: { + overAmount: { + _1sat: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_1sat'), + _10sats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_10sats'), + _100sats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_100sats'), + _1kSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_1k_sats'), + _10kSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_10k_sats'), + _100kSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_100k_sats'), + _1mSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_1m_sats'), + _10mSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_10m_sats'), + _1btc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_1btc'), + _10btc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_10btc'), + _100btc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_100btc'), + _1kBtc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_1k_btc'), + _10kBtc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_10k_btc'), + }, + amountRange: { + _0sats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_0sats'), + _1satTo10sats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_1sat_to_10sats'), + _10satsTo100sats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_10sats_to_100sats'), + _100satsTo1kSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_100sats_to_1k_sats'), + _1kSatsTo10kSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_1k_sats_to_10k_sats'), + _10kSatsTo100kSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_10k_sats_to_100k_sats'), + _100kSatsTo1mSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_100k_sats_to_1m_sats'), + _1mSatsTo10mSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_1m_sats_to_10m_sats'), + _10mSatsTo1btc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_10m_sats_to_1btc'), + _1btcTo10btc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_1btc_to_10btc'), + _10btcTo100btc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_10btc_to_100btc'), + _100btcTo1kBtc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_100btc_to_1k_btc'), + _1kBtcTo10kBtc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_1k_btc_to_10k_btc'), + _10kBtcTo100kBtc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_10k_btc_to_100k_btc'), + over100kBtc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_100k_btc'), + }, + underAmount: { + _10sats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_10sats'), + _100sats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_100sats'), + _1kSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_1k_sats'), + _10kSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_10k_sats'), + _100kSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_100k_sats'), + _1mSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_1m_sats'), + _10mSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_10m_sats'), + _1btc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_1btc'), + _10btc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_10btc'), + _100btc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_100btc'), + _1kBtc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_1k_btc'), + _10kBtc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_10k_btc'), + _100kBtc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_100k_btc'), + }, + }, + }, + }; + } + + /** + * Create a dynamic series endpoint builder for any series/index combination. + * + * Use this for programmatic access when the series name is determined at runtime. + * For type-safe access, use the `series` tree instead. + * + * @param {string} series - The series name + * @param {Index} index - The index name + * @returns {SeriesEndpoint} + */ + seriesEndpoint(series, index) { + return _endpoint(this, series, index); + } + + /** + * Health check + * + * Liveness probe. Returns server identity, uptime, and indexed/computed heights from local state only (no bitcoind round-trip). For real chain-tip catch-up, see `/api/server/sync`. + * + * Endpoint: `GET /health` + * @param {{ signal?: AbortSignal, onValue?: (value: Health) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getHealth({ signal, onValue, cache } = {}) { + const path = `/health`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * API version + * + * Returns the current version of the API server + * + * Endpoint: `GET /version` + * @param {{ signal?: AbortSignal, onValue?: (value: string) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getVersion({ signal, onValue, cache } = {}) { + const path = `/version`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Sync status + * + * Returns the sync status of the indexer, including indexed height, tip height, blocks behind, and last indexed timestamp. + * + * Endpoint: `GET /api/server/sync` + * @param {{ signal?: AbortSignal, onValue?: (value: SyncStatus) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getSyncStatus({ signal, onValue, cache } = {}) { + const path = `/api/server/sync`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Disk usage + * + * Returns the disk space used by BRK and Bitcoin data. + * + * Endpoint: `GET /api/server/disk` + * @param {{ signal?: AbortSignal, onValue?: (value: DiskUsage) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getDiskUsage({ signal, onValue, cache } = {}) { + const path = `/api/server/disk`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Series catalog + * + * Returns the complete hierarchical catalog of available series organized as a tree structure. Series are grouped by categories and subcategories. + * + * Endpoint: `GET /api/series` + * @param {{ signal?: AbortSignal, onValue?: (value: TreeNode) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getSeriesTree({ signal, onValue, cache } = {}) { + const path = `/api/series`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Series count + * + * Returns the number of series available per index type. + * + * Endpoint: `GET /api/series/count` + * @param {{ signal?: AbortSignal, onValue?: (value: SeriesCount[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getSeriesCount({ signal, onValue, cache } = {}) { + const path = `/api/series/count`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * List available indexes + * + * Returns all available indexes with their accepted query aliases. Use any alias when querying series. + * + * Endpoint: `GET /api/series/indexes` + * @param {{ signal?: AbortSignal, onValue?: (value: IndexInfo[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getIndexes({ signal, onValue, cache } = {}) { + const path = `/api/series/indexes`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Series list + * + * Paginated flat list of all available series names. Use `page` query param for pagination. + * + * Endpoint: `GET /api/series/list` + * + * @param {number=} [page] - Pagination index + * @param {number=} [per_page] - Results per page (default: 1000, max: 1000) + * @param {{ signal?: AbortSignal, onValue?: (value: PaginatedSeries) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async listSeries(page, per_page, { signal, onValue, cache } = {}) { + const params = new URLSearchParams(); + if (page !== undefined) params.set('page', String(page)); + if (per_page !== undefined) params.set('per_page', String(per_page)); + const query = params.toString(); + const path = `/api/series/list${query ? '?' + query : ''}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Search series + * + * Fuzzy search for series by name. Supports partial matches and typos. + * + * Endpoint: `GET /api/series/search` + * + * @param {SeriesName} q - Search query string + * @param {Limit=} [limit] - Maximum number of results + * @param {{ signal?: AbortSignal, onValue?: (value: string[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async searchSeries(q, limit, { signal, onValue, cache } = {}) { + const params = new URLSearchParams(); + params.set('q', String(q)); + if (limit !== undefined) params.set('limit', String(limit)); + const query = params.toString(); + const path = `/api/series/search${query ? '?' + query : ''}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Get series info + * + * Returns the supported indexes and value type for the specified series. + * + * Endpoint: `GET /api/series/{series}` + * + * @param {SeriesName} series + * @param {{ signal?: AbortSignal, onValue?: (value: SeriesInfo) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getSeriesInfo(series, { signal, onValue, cache } = {}) { + const path = `/api/series/${series}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Get series data + * + * Fetch data for a specific series at the given index. Use query parameters to filter by date range and format (json/csv). + * + * Endpoint: `GET /api/series/{series}/{index}` + * + * @param {SeriesName} series - Series name + * @param {Index} index - Aggregation index + * @param {RangeIndex=} [start] - Inclusive start: integer index, date (YYYY-MM-DD), or timestamp (ISO 8601). Negative integers count from end. Aliases: `from`, `f`, `s` + * @param {RangeIndex=} [end] - Exclusive end: integer index, date (YYYY-MM-DD), or timestamp (ISO 8601). Negative integers count from end. Aliases: `to`, `t`, `e` + * @param {Limit=} [limit] - Maximum number of values to return (ignored if `end` is set). Aliases: `count`, `c`, `l` + * @param {Format=} [format] - Format of the output + * @param {{ signal?: AbortSignal, onValue?: (value: AnySeriesData | string) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getSeries(series, index, start, end, limit, format, { signal, onValue, cache } = {}) { + const params = new URLSearchParams(); + if (start !== undefined) params.set('start', String(start)); + if (end !== undefined) params.set('end', String(end)); + if (limit !== undefined) params.set('limit', String(limit)); + if (format !== undefined) params.set('format', String(format)); + const query = params.toString(); + const path = `/api/series/${series}/${index}${query ? '?' + query : ''}`; + if (format === 'csv') return this.getText(path, { signal, onValue, cache }); + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Get raw series data + * + * Returns just the data array without the SeriesData wrapper. Supports the same range and format parameters as the standard endpoint. + * + * Endpoint: `GET /api/series/{series}/{index}/data` + * + * @param {SeriesName} series - Series name + * @param {Index} index - Aggregation index + * @param {RangeIndex=} [start] - Inclusive start: integer index, date (YYYY-MM-DD), or timestamp (ISO 8601). Negative integers count from end. Aliases: `from`, `f`, `s` + * @param {RangeIndex=} [end] - Exclusive end: integer index, date (YYYY-MM-DD), or timestamp (ISO 8601). Negative integers count from end. Aliases: `to`, `t`, `e` + * @param {Limit=} [limit] - Maximum number of values to return (ignored if `end` is set). Aliases: `count`, `c`, `l` + * @param {Format=} [format] - Format of the output + * @param {{ signal?: AbortSignal, onValue?: (value: boolean[] | string) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getSeriesData(series, index, start, end, limit, format, { signal, onValue, cache } = {}) { + const params = new URLSearchParams(); + if (start !== undefined) params.set('start', String(start)); + if (end !== undefined) params.set('end', String(end)); + if (limit !== undefined) params.set('limit', String(limit)); + if (format !== undefined) params.set('format', String(format)); + const query = params.toString(); + const path = `/api/series/${series}/${index}/data${query ? '?' + query : ''}`; + if (format === 'csv') return this.getText(path, { signal, onValue, cache }); + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Get latest series value + * + * Returns the single most recent value for a series, unwrapped (not inside a SeriesData object). + * + * Endpoint: `GET /api/series/{series}/{index}/latest` + * + * @param {SeriesName} series - Series name + * @param {Index} index - Aggregation index + * @param {{ signal?: AbortSignal, onValue?: (value: *) => void, cache?: boolean }} [options] + * @returns {Promise<*>} + */ + async getSeriesLatest(series, index, { signal, onValue, cache } = {}) { + const path = `/api/series/${series}/${index}/latest`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Get series data length + * + * Returns the total number of data points for a series at the given index. + * + * Endpoint: `GET /api/series/{series}/{index}/len` + * + * @param {SeriesName} series - Series name + * @param {Index} index - Aggregation index + * @param {{ signal?: AbortSignal, onValue?: (value: number) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getSeriesLen(series, index, { signal, onValue, cache } = {}) { + const path = `/api/series/${series}/${index}/len`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Get series version + * + * Returns the current version of a series. Changes when the series data is updated. + * + * Endpoint: `GET /api/series/{series}/{index}/version` + * + * @param {SeriesName} series - Series name + * @param {Index} index - Aggregation index + * @param {{ signal?: AbortSignal, onValue?: (value: Version) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getSeriesVersion(series, index, { signal, onValue, cache } = {}) { + const path = `/api/series/${series}/${index}/version`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Bulk series data + * + * Fetch multiple series in a single request. Supports filtering by index and date range. Returns an array of SeriesData objects. For a single series, use `get_series` instead. + * + * Endpoint: `GET /api/series/bulk` + * + * @param {SeriesList} series - Requested series + * @param {Index} index - Index to query + * @param {RangeIndex=} [start] - Inclusive start: integer index, date (YYYY-MM-DD), or timestamp (ISO 8601). Negative integers count from end. Aliases: `from`, `f`, `s` + * @param {RangeIndex=} [end] - Exclusive end: integer index, date (YYYY-MM-DD), or timestamp (ISO 8601). Negative integers count from end. Aliases: `to`, `t`, `e` + * @param {Limit=} [limit] - Maximum number of values to return (ignored if `end` is set). Aliases: `count`, `c`, `l` + * @param {Format=} [format] - Format of the output + * @param {{ signal?: AbortSignal, onValue?: (value: AnySeriesData[] | string) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getSeriesBulk(series, index, start, end, limit, format, { signal, onValue, cache } = {}) { + const params = new URLSearchParams(); + params.set('series', String(series)); + params.set('index', String(index)); + if (start !== undefined) params.set('start', String(start)); + if (end !== undefined) params.set('end', String(end)); + if (limit !== undefined) params.set('limit', String(limit)); + if (format !== undefined) params.set('format', String(format)); + const query = params.toString(); + const path = `/api/series/bulk${query ? '?' + query : ''}`; + if (format === 'csv') return this.getText(path, { signal, onValue, cache }); + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Available URPD cohorts + * + * Cohorts for which URPD data is available. Returns names like `all`, `sth`, `lth`, `utxos_under_1h_old`. + * + * Endpoint: `GET /api/urpd` + * @param {{ signal?: AbortSignal, onValue?: (value: Cohort[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async listUrpdCohorts({ signal, onValue, cache } = {}) { + const path = `/api/urpd`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Available URPD dates + * + * Dates for which a URPD snapshot is available for the cohort. One entry per UTC day, sorted ascending. + * + * Endpoint: `GET /api/urpd/{cohort}/dates` + * + * @param {Cohort} cohort + * @param {{ signal?: AbortSignal, onValue?: (value: Date[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async listUrpdDates(cohort, { signal, onValue, cache } = {}) { + const path = `/api/urpd/${cohort}/dates`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Latest URPD + * + * URPD for the most recent available date in the cohort. The response's `date` field echoes which date was served. + * + * See the URPD tag description for the response shape and `agg` options. + * + * Endpoint: `GET /api/urpd/{cohort}` + * + * @param {Cohort} cohort + * @param {UrpdAggregation=} [agg] - Aggregation strategy. Default: raw (no aggregation). Accepts `bucket` as alias. + * @param {{ signal?: AbortSignal, onValue?: (value: Urpd) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getUrpd(cohort, agg, { signal, onValue, cache } = {}) { + const params = new URLSearchParams(); + if (agg !== undefined) params.set('agg', String(agg)); + const query = params.toString(); + const path = `/api/urpd/${cohort}${query ? '?' + query : ''}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * URPD at date + * + * URPD for a (cohort, date) pair. Returns `{ cohort, date, aggregation, close, total_supply, buckets }` where each bucket is `{ price_floor, supply, realized_cap, unrealized_pnl }`. + * + * See the URPD tag description for unit conventions and `agg` options. + * + * Endpoint: `GET /api/urpd/{cohort}/{date}` + * + * @param {Cohort} cohort + * @param {string} date + * @param {UrpdAggregation=} [agg] - Aggregation strategy. Default: raw (no aggregation). Accepts `bucket` as alias. + * @param {{ signal?: AbortSignal, onValue?: (value: Urpd) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getUrpdAt(cohort, date, agg, { signal, onValue, cache } = {}) { + const params = new URLSearchParams(); + if (agg !== undefined) params.set('agg', String(agg)); + const query = params.toString(); + const path = `/api/urpd/${cohort}/${date}${query ? '?' + query : ''}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Difficulty adjustment + * + * Get current difficulty adjustment progress and estimates. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-difficulty-adjustment)* + * + * Endpoint: `GET /api/v1/difficulty-adjustment` + * @param {{ signal?: AbortSignal, onValue?: (value: DifficultyAdjustment) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getDifficultyAdjustment({ signal, onValue, cache } = {}) { + const path = `/api/v1/difficulty-adjustment`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Current BTC price + * + * Returns bitcoin latest price (on-chain derived, USD only). + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-price)* + * + * Endpoint: `GET /api/v1/prices` + * @param {{ signal?: AbortSignal, onValue?: (value: Prices) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getPrices({ signal, onValue, cache } = {}) { + const path = `/api/v1/prices`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Historical price + * + * Get historical BTC/USD price. Optionally specify a UNIX timestamp to get the price at that time. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-historical-price)* + * + * Endpoint: `GET /api/v1/historical-price` + * + * @param {Timestamp=} [timestamp] + * @param {{ signal?: AbortSignal, onValue?: (value: HistoricalPrice) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getHistoricalPrice(timestamp, { signal, onValue, cache } = {}) { + const params = new URLSearchParams(); + if (timestamp !== undefined) params.set('timestamp', String(timestamp)); + const query = params.toString(); + const path = `/api/v1/historical-price${query ? '?' + query : ''}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Address information + * + * Retrieve address information including balance and transaction counts. Supports all standard Bitcoin address types (P2PKH, P2SH, P2WPKH, P2WSH, P2TR). + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-address)* + * + * Endpoint: `GET /api/address/{address}` + * + * @param {Addr} address + * @param {{ signal?: AbortSignal, onValue?: (value: AddrStats) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getAddress(address, { signal, onValue, cache } = {}) { + const path = `/api/address/${address}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Address transactions + * + * Get transaction history for an address, newest first. Returns up to 50 mempool transactions plus a confirmed page sized to fill the response to 50 total (chain floor of 25, so 25-50 confirmed depending on mempool weight). To paginate further confirmed history, use `/address/{address}/txs/chain/{last_seen_txid}`. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-address-transactions)* + * + * Endpoint: `GET /api/address/{address}/txs` + * + * @param {Addr} address + * @param {{ signal?: AbortSignal, onValue?: (value: Transaction[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getAddressTxs(address, { signal, onValue, cache } = {}) { + const path = `/api/address/${address}/txs`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Address confirmed transactions + * + * Get the first 25 confirmed transactions for an address. For pagination, use the path-style form `/txs/chain/{last_seen_txid}`. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-address-transactions-chain)* + * + * Endpoint: `GET /api/address/{address}/txs/chain` + * + * @param {Addr} address + * @param {{ signal?: AbortSignal, onValue?: (value: Transaction[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getAddressConfirmedTxs(address, { signal, onValue, cache } = {}) { + const path = `/api/address/${address}/txs/chain`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Address confirmed transactions (paginated) + * + * Get the next 25 confirmed transactions strictly older than `after_txid` (Esplora-canonical pagination form, matches mempool.space). + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-address-transactions-chain)* + * + * Endpoint: `GET /api/address/{address}/txs/chain/{after_txid}` + * + * @param {Addr} address + * @param {Txid} after_txid - Last txid from the previous page (return transactions strictly older than this) + * @param {{ signal?: AbortSignal, onValue?: (value: Transaction[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getAddressConfirmedTxsAfter(address, after_txid, { signal, onValue, cache } = {}) { + const path = `/api/address/${address}/txs/chain/${after_txid}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Address mempool transactions + * + * Get unconfirmed transactions for an address from the mempool, newest first (up to 50). + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-address-transactions-mempool)* + * + * Endpoint: `GET /api/address/{address}/txs/mempool` + * + * @param {Addr} address + * @param {{ signal?: AbortSignal, onValue?: (value: Transaction[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getAddressMempoolTxs(address, { signal, onValue, cache } = {}) { + const path = `/api/address/${address}/txs/mempool`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Address UTXOs + * + * Get unspent transaction outputs (UTXOs) for an address. Returns txid, vout, value, and confirmation status for each UTXO. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-address-utxo)* + * + * Endpoint: `GET /api/address/{address}/utxo` + * + * @param {Addr} address + * @param {{ signal?: AbortSignal, onValue?: (value: Utxo[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getAddressUtxos(address, { signal, onValue, cache } = {}) { + const path = `/api/address/${address}/utxo`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Validate address + * + * Validate a Bitcoin address and get information about its type and scriptPubKey. Returns `isvalid: false` with an error message for invalid addresses. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-address-validate)* + * + * Endpoint: `GET /api/v1/validate-address/{address}` + * + * @param {string} address - Bitcoin address to validate (can be any string) + * @param {{ signal?: AbortSignal, onValue?: (value: AddrValidation) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async validateAddress(address, { signal, onValue, cache } = {}) { + const path = `/api/v1/validate-address/${address}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Block information + * + * Retrieve block information by block hash. Returns block metadata including height, timestamp, difficulty, size, weight, and transaction count. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block)* + * + * Endpoint: `GET /api/block/{hash}` + * + * @param {BlockHash} hash + * @param {{ signal?: AbortSignal, onValue?: (value: BlockInfo) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getBlock(hash, { signal, onValue, cache } = {}) { + const path = `/api/block/${hash}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Block (v1) + * + * Returns block details with extras by hash. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-v1)* + * + * Endpoint: `GET /api/v1/block/{hash}` + * + * @param {BlockHash} hash + * @param {{ signal?: AbortSignal, onValue?: (value: BlockInfoV1) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getBlockV1(hash, { signal, onValue, cache } = {}) { + const path = `/api/v1/block/${hash}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Block header + * + * Returns the hex-encoded 80-byte block header. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-header)* + * + * Endpoint: `GET /api/block/{hash}/header` + * + * @param {BlockHash} hash + * @param {{ signal?: AbortSignal, onValue?: (value: Hex) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getBlockHeader(hash, { signal, onValue, cache } = {}) { + const path = `/api/block/${hash}/header`; + return this.getText(path, { signal, onValue, cache }); + } + + /** + * Block hash by height + * + * Retrieve the block hash at a given height. Returns the hash as plain text. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-height)* + * + * Endpoint: `GET /api/block-height/{height}` + * + * @param {Height} height + * @param {{ signal?: AbortSignal, onValue?: (value: BlockHash) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getBlockByHeight(height, { signal, onValue, cache } = {}) { + const path = `/api/block-height/${height}`; + return this.getText(path, { signal, onValue, cache }); + } + + /** + * Block by timestamp + * + * Find the block closest to a given UNIX timestamp. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-timestamp)* + * + * Endpoint: `GET /api/v1/mining/blocks/timestamp/{timestamp}` + * + * @param {Timestamp} timestamp + * @param {{ signal?: AbortSignal, onValue?: (value: BlockTimestamp) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getBlockByTimestamp(timestamp, { signal, onValue, cache } = {}) { + const path = `/api/v1/mining/blocks/timestamp/${timestamp}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Raw block + * + * Returns the raw block data in binary format. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-raw)* + * + * Endpoint: `GET /api/block/{hash}/raw` + * + * @param {BlockHash} hash + * @param {{ signal?: AbortSignal, onValue?: (value: Uint8Array) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getBlockRaw(hash, { signal, onValue, cache } = {}) { + const path = `/api/block/${hash}/raw`; + return this.getBytes(path, { signal, onValue, cache }); + } + + /** + * Block status + * + * Retrieve the status of a block. Returns whether the block is in the best chain and, if so, its height and the hash of the next block. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-status)* + * + * Endpoint: `GET /api/block/{hash}/status` + * + * @param {BlockHash} hash + * @param {{ signal?: AbortSignal, onValue?: (value: BlockStatus) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getBlockStatus(hash, { signal, onValue, cache } = {}) { + const path = `/api/block/${hash}/status`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Block tip height + * + * Returns the height of the last block. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-tip-height)* + * + * Endpoint: `GET /api/blocks/tip/height` + * @param {{ signal?: AbortSignal, onValue?: (value: Height) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getBlockTipHeight({ signal, onValue, cache } = {}) { + const path = `/api/blocks/tip/height`; + return Number(await this.getText(path, { signal, cache, onValue: onValue ? (v) => onValue(Number(v)) : undefined })); + } + + /** + * Block tip hash + * + * Returns the hash of the last block. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-tip-hash)* + * + * Endpoint: `GET /api/blocks/tip/hash` + * @param {{ signal?: AbortSignal, onValue?: (value: BlockHash) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getBlockTipHash({ signal, onValue, cache } = {}) { + const path = `/api/blocks/tip/hash`; + return this.getText(path, { signal, onValue, cache }); + } + + /** + * Transaction ID at index + * + * Retrieve a single transaction ID at a specific index within a block. Returns plain text txid. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-transaction-id)* + * + * Endpoint: `GET /api/block/{hash}/txid/{index}` + * + * @param {BlockHash} hash - Bitcoin block hash + * @param {BlockTxIndex} index - Transaction index within the block (0-based) + * @param {{ signal?: AbortSignal, onValue?: (value: Txid) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getBlockTxid(hash, index, { signal, onValue, cache } = {}) { + const path = `/api/block/${hash}/txid/${index}`; + return this.getText(path, { signal, onValue, cache }); + } + + /** + * Block transaction IDs + * + * Retrieve all transaction IDs in a block. Returns an array of txids in block order. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-transaction-ids)* + * + * Endpoint: `GET /api/block/{hash}/txids` + * + * @param {BlockHash} hash + * @param {{ signal?: AbortSignal, onValue?: (value: Txid[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getBlockTxids(hash, { signal, onValue, cache } = {}) { + const path = `/api/block/${hash}/txids`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Block transactions + * + * Retrieve transactions in a block by block hash. Returns up to 25 transactions starting from index 0. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-transactions)* + * + * Endpoint: `GET /api/block/{hash}/txs` + * + * @param {BlockHash} hash + * @param {{ signal?: AbortSignal, onValue?: (value: Transaction[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getBlockTxs(hash, { signal, onValue, cache } = {}) { + const path = `/api/block/${hash}/txs`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Block transactions (paginated) + * + * Retrieve transactions in a block by block hash, starting from the specified index. Returns up to 25 transactions at a time. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-transactions)* + * + * Endpoint: `GET /api/block/{hash}/txs/{start_index}` + * + * @param {BlockHash} hash - Bitcoin block hash + * @param {BlockTxIndex} start_index - Starting transaction index within the block (0-based) + * @param {{ signal?: AbortSignal, onValue?: (value: Transaction[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getBlockTxsFromIndex(hash, start_index, { signal, onValue, cache } = {}) { + const path = `/api/block/${hash}/txs/${start_index}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Recent blocks + * + * Retrieve the last 10 blocks. Returns block metadata for each block. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-blocks)* + * + * Endpoint: `GET /api/blocks` + * @param {{ signal?: AbortSignal, onValue?: (value: BlockInfo[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getBlocks({ signal, onValue, cache } = {}) { + const path = `/api/blocks`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Blocks from height + * + * Retrieve up to 10 blocks going backwards from the given height. For example, height=100 returns blocks 100, 99, 98, ..., 91. Height=0 returns only block 0. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-blocks)* + * + * Endpoint: `GET /api/blocks/{height}` + * + * @param {Height} height + * @param {{ signal?: AbortSignal, onValue?: (value: BlockInfo[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getBlocksFromHeight(height, { signal, onValue, cache } = {}) { + const path = `/api/blocks/${height}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Recent blocks with extras + * + * Retrieve the last 15 blocks with extended data including pool identification and fee statistics. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-blocks-v1)* + * + * Endpoint: `GET /api/v1/blocks` + * @param {{ signal?: AbortSignal, onValue?: (value: BlockInfoV1[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getBlocksV1({ signal, onValue, cache } = {}) { + const path = `/api/v1/blocks`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Blocks from height with extras + * + * Retrieve up to 15 blocks with extended data going backwards from the given height. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-blocks-v1)* + * + * Endpoint: `GET /api/v1/blocks/{height}` + * + * @param {Height} height + * @param {{ signal?: AbortSignal, onValue?: (value: BlockInfoV1[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getBlocksV1FromHeight(height, { signal, onValue, cache } = {}) { + const path = `/api/v1/blocks/${height}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * List all mining pools + * + * Get list of all known mining pools with their identifiers. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-mining-pools)* + * + * Endpoint: `GET /api/v1/mining/pools` + * @param {{ signal?: AbortSignal, onValue?: (value: PoolInfo[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getPools({ signal, onValue, cache } = {}) { + const path = `/api/v1/mining/pools`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Mining pool statistics + * + * Get mining pool statistics for a time period. Valid periods: `24h`, `3d`, `1w`, `1m`, `3m`, `6m`, `1y`, `2y`, `3y`. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-mining-pools)* + * + * Endpoint: `GET /api/v1/mining/pools/{time_period}` + * + * @param {TimePeriod} time_period + * @param {{ signal?: AbortSignal, onValue?: (value: PoolsSummary) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getPoolStats(time_period, { signal, onValue, cache } = {}) { + const path = `/api/v1/mining/pools/${time_period}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Mining pool details + * + * Get detailed information about a specific mining pool including block counts and shares for different time periods. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-mining-pool)* + * + * Endpoint: `GET /api/v1/mining/pool/{slug}` + * + * @param {PoolSlug} slug + * @param {{ signal?: AbortSignal, onValue?: (value: PoolDetail) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getPool(slug, { signal, onValue, cache } = {}) { + const path = `/api/v1/mining/pool/${slug}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * All pools hashrate (all time) + * + * Get hashrate data for all mining pools. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-mining-pool-hashrates)* + * + * Endpoint: `GET /api/v1/mining/hashrate/pools` + * @param {{ signal?: AbortSignal, onValue?: (value: PoolHashrateEntry[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getPoolsHashrate({ signal, onValue, cache } = {}) { + const path = `/api/v1/mining/hashrate/pools`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * All pools hashrate + * + * Get hashrate data for all mining pools for a time period. Valid periods: `1m`, `3m`, `6m`, `1y`, `2y`, `3y`. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-mining-pool-hashrates)* + * + * Endpoint: `GET /api/v1/mining/hashrate/pools/{time_period}` + * + * @param {TimePeriod} time_period + * @param {{ signal?: AbortSignal, onValue?: (value: PoolHashrateEntry[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getPoolsHashrateByPeriod(time_period, { signal, onValue, cache } = {}) { + const path = `/api/v1/mining/hashrate/pools/${time_period}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Mining pool hashrate + * + * Get hashrate history for a specific mining pool. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-mining-pool-hashrate)* + * + * Endpoint: `GET /api/v1/mining/pool/{slug}/hashrate` + * + * @param {PoolSlug} slug + * @param {{ signal?: AbortSignal, onValue?: (value: PoolHashrateEntry[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getPoolHashrate(slug, { signal, onValue, cache } = {}) { + const path = `/api/v1/mining/pool/${slug}/hashrate`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Mining pool blocks + * + * Get the 10 most recent blocks mined by a specific pool. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-mining-pool-blocks)* + * + * Endpoint: `GET /api/v1/mining/pool/{slug}/blocks` + * + * @param {PoolSlug} slug + * @param {{ signal?: AbortSignal, onValue?: (value: BlockInfoV1[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getPoolBlocks(slug, { signal, onValue, cache } = {}) { + const path = `/api/v1/mining/pool/${slug}/blocks`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Mining pool blocks from height + * + * Get 10 blocks mined by a specific pool before (and including) the given height. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-mining-pool-blocks)* + * + * Endpoint: `GET /api/v1/mining/pool/{slug}/blocks/{height}` + * + * @param {PoolSlug} slug + * @param {Height} height + * @param {{ signal?: AbortSignal, onValue?: (value: BlockInfoV1[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getPoolBlocksFrom(slug, height, { signal, onValue, cache } = {}) { + const path = `/api/v1/mining/pool/${slug}/blocks/${height}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Network hashrate (all time) + * + * Get network hashrate and difficulty data for all time. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-hashrate)* + * + * Endpoint: `GET /api/v1/mining/hashrate` + * @param {{ signal?: AbortSignal, onValue?: (value: HashrateSummary) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getHashrate({ signal, onValue, cache } = {}) { + const path = `/api/v1/mining/hashrate`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Network hashrate + * + * Get network hashrate and difficulty data for a time period. Valid periods: `24h`, `3d`, `1w`, `1m`, `3m`, `6m`, `1y`, `2y`, `3y`. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-hashrate)* + * + * Endpoint: `GET /api/v1/mining/hashrate/{time_period}` + * + * @param {TimePeriod} time_period + * @param {{ signal?: AbortSignal, onValue?: (value: HashrateSummary) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getHashrateByPeriod(time_period, { signal, onValue, cache } = {}) { + const path = `/api/v1/mining/hashrate/${time_period}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Difficulty adjustments (all time) + * + * Get historical difficulty adjustments including timestamp, block height, difficulty value, and percentage change. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-difficulty-adjustments)* + * + * Endpoint: `GET /api/v1/mining/difficulty-adjustments` + * @param {{ signal?: AbortSignal, onValue?: (value: DifficultyAdjustmentEntry[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getDifficultyAdjustments({ signal, onValue, cache } = {}) { + const path = `/api/v1/mining/difficulty-adjustments`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Difficulty adjustments + * + * Get historical difficulty adjustments for a time period. Valid periods: `24h`, `3d`, `1w`, `1m`, `3m`, `6m`, `1y`, `2y`, `3y`. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-difficulty-adjustments)* + * + * Endpoint: `GET /api/v1/mining/difficulty-adjustments/{time_period}` + * + * @param {TimePeriod} time_period + * @param {{ signal?: AbortSignal, onValue?: (value: DifficultyAdjustmentEntry[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getDifficultyAdjustmentsByPeriod(time_period, { signal, onValue, cache } = {}) { + const path = `/api/v1/mining/difficulty-adjustments/${time_period}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Mining reward statistics + * + * Get mining reward statistics for the last N blocks including total rewards, fees, and transaction count. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-reward-stats)* + * + * Endpoint: `GET /api/v1/mining/reward-stats/{block_count}` + * + * @param {number} block_count - Number of recent blocks to include + * @param {{ signal?: AbortSignal, onValue?: (value: RewardStats) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getRewardStats(block_count, { signal, onValue, cache } = {}) { + const path = `/api/v1/mining/reward-stats/${block_count}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Block fees + * + * Get average total fees per block for a time period. Valid periods: `24h`, `3d`, `1w`, `1m`, `3m`, `6m`, `1y`, `2y`, `3y`. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-fees)* + * + * Endpoint: `GET /api/v1/mining/blocks/fees/{time_period}` + * + * @param {TimePeriod} time_period + * @param {{ signal?: AbortSignal, onValue?: (value: BlockFeesEntry[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getBlockFees(time_period, { signal, onValue, cache } = {}) { + const path = `/api/v1/mining/blocks/fees/${time_period}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Block rewards + * + * Get average coinbase reward (subsidy + fees) per block for a time period. Valid periods: `24h`, `3d`, `1w`, `1m`, `3m`, `6m`, `1y`, `2y`, `3y`. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-rewards)* + * + * Endpoint: `GET /api/v1/mining/blocks/rewards/{time_period}` + * + * @param {TimePeriod} time_period + * @param {{ signal?: AbortSignal, onValue?: (value: BlockRewardsEntry[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getBlockRewards(time_period, { signal, onValue, cache } = {}) { + const path = `/api/v1/mining/blocks/rewards/${time_period}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Block fee rates + * + * Get block fee rate percentiles (min, 10th, 25th, median, 75th, 90th, max) for a time period. Valid periods: `24h`, `3d`, `1w`, `1m`, `3m`, `6m`, `1y`, `2y`, `3y`. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-feerates)* + * + * Endpoint: `GET /api/v1/mining/blocks/fee-rates/{time_period}` + * + * @param {TimePeriod} time_period + * @param {{ signal?: AbortSignal, onValue?: (value: BlockFeeRatesEntry[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getBlockFeeRates(time_period, { signal, onValue, cache } = {}) { + const path = `/api/v1/mining/blocks/fee-rates/${time_period}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Block sizes and weights + * + * Get average block sizes and weights for a time period. Valid periods: `24h`, `3d`, `1w`, `1m`, `3m`, `6m`, `1y`, `2y`, `3y`. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-sizes-weights)* + * + * Endpoint: `GET /api/v1/mining/blocks/sizes-weights/{time_period}` + * + * @param {TimePeriod} time_period + * @param {{ signal?: AbortSignal, onValue?: (value: BlockSizesWeights) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getBlockSizesWeights(time_period, { signal, onValue, cache } = {}) { + const path = `/api/v1/mining/blocks/sizes-weights/${time_period}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Projected mempool blocks + * + * Projected blocks for fee estimation. Block 0 reflects Bitcoin Core's actual next-block selection; blocks 1+ are a fee-tier approximation. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-mempool-blocks-fees)* + * + * Endpoint: `GET /api/v1/fees/mempool-blocks` + * @param {{ signal?: AbortSignal, onValue?: (value: MempoolBlock[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getMempoolBlocks({ signal, onValue, cache } = {}) { + const path = `/api/v1/fees/mempool-blocks`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Recommended fees + * + * Recommended fee rates by confirmation target. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-recommended-fees)* + * + * Endpoint: `GET /api/v1/fees/recommended` + * @param {{ signal?: AbortSignal, onValue?: (value: RecommendedFees) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getRecommendedFees({ signal, onValue, cache } = {}) { + const path = `/api/v1/fees/recommended`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Precise recommended fees + * + * Recommended fee rates with sub-integer precision. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-recommended-fees-precise)* + * + * Endpoint: `GET /api/v1/fees/precise` + * @param {{ signal?: AbortSignal, onValue?: (value: RecommendedFees) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getPreciseFees({ signal, onValue, cache } = {}) { + const path = `/api/v1/fees/precise`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Mempool statistics + * + * Get current mempool statistics including transaction count, total vsize, total fees, and fee histogram. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-mempool)* + * + * Endpoint: `GET /api/mempool` + * @param {{ signal?: AbortSignal, onValue?: (value: MempoolInfo) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getMempool({ signal, onValue, cache } = {}) { + const path = `/api/mempool`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Mempool content hash + * + * Returns an opaque hash that changes whenever the projected next block changes. Same value as the mempool ETag. Useful as a freshness/liveness signal: if it stays constant for tens of seconds on a live network, the mempool sync loop has stalled. + * + * Endpoint: `GET /api/mempool/hash` + * @param {{ signal?: AbortSignal, onValue?: (value: NextBlockHash) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getMempoolHash({ signal, onValue, cache } = {}) { + const path = `/api/mempool/hash`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Mempool transaction IDs + * + * Get all transaction IDs currently in the mempool. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-mempool-transaction-ids)* + * + * Endpoint: `GET /api/mempool/txids` + * @param {{ signal?: AbortSignal, onValue?: (value: Txid[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getMempoolTxids({ signal, onValue, cache } = {}) { + const path = `/api/mempool/txids`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Recent mempool transactions + * + * Get the last 10 transactions to enter the mempool. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-mempool-recent)* + * + * Endpoint: `GET /api/mempool/recent` + * @param {{ signal?: AbortSignal, onValue?: (value: MempoolRecentTx[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getMempoolRecent({ signal, onValue, cache } = {}) { + const path = `/api/mempool/recent`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Recent RBF replacements + * + * Returns up to 25 most-recent RBF replacement trees across the whole mempool. Each entry has the same shape as `tx_rbf().replacements`. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-replacements)* + * + * Endpoint: `GET /api/v1/replacements` + * @param {{ signal?: AbortSignal, onValue?: (value: ReplacementNode[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getReplacements({ signal, onValue, cache } = {}) { + const path = `/api/v1/replacements`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Recent full-RBF replacements + * + * Like `/api/v1/replacements`, but limited to trees where at least one predecessor was non-signaling (full-RBF). + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-fullrbf-replacements)* + * + * Endpoint: `GET /api/v1/fullrbf/replacements` + * @param {{ signal?: AbortSignal, onValue?: (value: ReplacementNode[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getFullrbfReplacements({ signal, onValue, cache } = {}) { + const path = `/api/v1/fullrbf/replacements`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Projected next block template + * + * Bitcoin Core's `getblocktemplate` selection: full transaction bodies in GBT order with aggregate stats. The returned `hash` is an opaque content token; pass it as `` on `/api/v1/mempool/block-template/diff/{hash}` to fetch deltas instead of refetching the whole template. + * + * Endpoint: `GET /api/v1/mempool/block-template` + * @param {{ signal?: AbortSignal, onValue?: (value: BlockTemplate) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getBlockTemplate({ signal, onValue, cache } = {}) { + const path = `/api/v1/mempool/block-template`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Block template diff since hash + * + * Delta of the projected next block since ``. `order` is the full new template in order: each entry is either a number (index into the prior template the client cached at ``) or a transaction object (new body to insert at this position). Walk `order` once to rebuild; `removed` is a convenience list of txids that left so clients can evict cached bodies. After applying, use the response `hash` as `` on the next call to keep iterating. Returns `404` when `` has aged out of server history; clients should fall back to `/api/v1/mempool/block-template`. + * + * Endpoint: `GET /api/v1/mempool/block-template/diff/{hash}` + * + * @param {NextBlockHash} hash + * @param {{ signal?: AbortSignal, onValue?: (value: BlockTemplateDiff) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getBlockTemplateDiff(hash, { signal, onValue, cache } = {}) { + const path = `/api/v1/mempool/block-template/diff/${hash}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Live BTC/USD price + * + * Returns the current BTC/USD price in dollars, derived from on-chain round-dollar output patterns in the last 12 blocks plus mempool. + * + * Endpoint: `GET /api/mempool/price` + * @param {{ signal?: AbortSignal, onValue?: (value: Dollars) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getLivePrice({ signal, onValue, cache } = {}) { + const path = `/api/mempool/price`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Live BTC/USD price + * + * Current BTC/USD price in dollars. Same value as `/api/mempool/price`. Confirmed per-height history is available at `/api/vecs/height-to-price`. + * + * Endpoint: `GET /api/oracle/price` + * @param {{ signal?: AbortSignal, onValue?: (value: Dollars) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getOraclePrice({ signal, onValue, cache } = {}) { + const path = `/api/oracle/price`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Live payment output histogram + * + * Live smoothed histogram of oracle-eligible payment outputs, binned by output value on the oracle log scale. It combines the committed oracle window with the forming mempool block. A flat array of log-scale bins. + * + * Endpoint: `GET /api/oracle/histogram/payments/live` + * @param {{ signal?: AbortSignal, onValue?: (value: number[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getOracleHistogramPaymentsLive({ signal, onValue, cache } = {}) { + const path = `/api/oracle/histogram/payments/live`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Payment output histogram at height or day + * + * Smoothed histogram of oracle-eligible payment outputs for a confirmed point. A block height (`840000`) gives that block's oracle payment histogram; a calendar date (`YYYY-MM-DD`) gives the average of that day's per-block payment histograms. A flat array of log-scale bins. + * + * Endpoint: `GET /api/oracle/histogram/payments/{point}` + * + * @param {string} point + * @param {{ signal?: AbortSignal, onValue?: (value: number[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getOracleHistogramPayments(point, { signal, onValue, cache } = {}) { + const path = `/api/oracle/histogram/payments/${point}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Live output value histogram + * + * Live unfiltered output value histogram for the forming mempool block. Every live output is binned by value on the oracle log scale; no oracle payment filters are applied. A flat array of log-scale bins, all zero when no mempool is configured. + * + * Endpoint: `GET /api/oracle/histogram/outputs/live` + * @param {{ signal?: AbortSignal, onValue?: (value: number[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getOracleHistogramOutputsLive({ signal, onValue, cache } = {}) { + const path = `/api/oracle/histogram/outputs/live`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Output value histogram at height or day + * + * Unfiltered output value histogram for a confirmed point. A block height (`840000`) gives every output in that block, coinbase included, binned by value on the oracle log scale; a calendar date (`YYYY-MM-DD`) sums every block that day. A flat array of log-scale bins. + * + * Endpoint: `GET /api/oracle/histogram/outputs/{point}` + * + * @param {string} point + * @param {{ signal?: AbortSignal, onValue?: (value: number[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getOracleHistogramOutputs(point, { signal, onValue, cache } = {}) { + const path = `/api/oracle/histogram/outputs/${point}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Txid by index + * + * Retrieve the transaction ID (txid) at a given global transaction index. Returns the txid as plain text. + * + * Endpoint: `GET /api/tx-index/{index}` + * + * @param {TxIndex} index + * @param {{ signal?: AbortSignal, onValue?: (value: Txid) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getTxByIndex(index, { signal, onValue, cache } = {}) { + const path = `/api/tx-index/${index}`; + return this.getText(path, { signal, onValue, cache }); + } + + /** + * CPFP info + * + * Returns ancestors and descendants for a CPFP (Child Pays For Parent) transaction, including the effective fee rate of the package. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-children-pay-for-parent)* + * + * Endpoint: `GET /api/v1/cpfp/{txid}` + * + * @param {Txid} txid + * @param {{ signal?: AbortSignal, onValue?: (value: CpfpInfo) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getCpfp(txid, { signal, onValue, cache } = {}) { + const path = `/api/v1/cpfp/${txid}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * RBF replacement history + * + * Returns the RBF replacement tree for a transaction, if any. Both `replacements` and `replaces` are null when the tx has no known RBF history within the mempool monitor's retention window. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-transaction-rbf-history)* + * + * Endpoint: `GET /api/v1/tx/{txid}/rbf` + * + * @param {Txid} txid + * @param {{ signal?: AbortSignal, onValue?: (value: RbfResponse) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getTxRbf(txid, { signal, onValue, cache } = {}) { + const path = `/api/v1/tx/${txid}/rbf`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Transaction information + * + * Retrieve complete transaction data by transaction ID (txid). Returns inputs, outputs, fee, size, and confirmation status. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-transaction)* + * + * Endpoint: `GET /api/tx/{txid}` + * + * @param {Txid} txid + * @param {{ signal?: AbortSignal, onValue?: (value: Transaction) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getTx(txid, { signal, onValue, cache } = {}) { + const path = `/api/tx/${txid}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Transaction hex + * + * Retrieve the raw transaction as a hex-encoded string. Returns the serialized transaction in hexadecimal format. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-transaction-hex)* + * + * Endpoint: `GET /api/tx/{txid}/hex` + * + * @param {Txid} txid + * @param {{ signal?: AbortSignal, onValue?: (value: Hex) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getTxHex(txid, { signal, onValue, cache } = {}) { + const path = `/api/tx/${txid}/hex`; + return this.getText(path, { signal, onValue, cache }); + } + + /** + * Transaction merkleblock proof + * + * Get the merkleblock proof for a transaction (BIP37 format, hex encoded). + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-transaction-merkleblock-proof)* + * + * Endpoint: `GET /api/tx/{txid}/merkleblock-proof` + * + * @param {Txid} txid + * @param {{ signal?: AbortSignal, onValue?: (value: Hex) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getTxMerkleblockProof(txid, { signal, onValue, cache } = {}) { + const path = `/api/tx/${txid}/merkleblock-proof`; + return this.getText(path, { signal, onValue, cache }); + } + + /** + * Transaction merkle proof + * + * Get the merkle inclusion proof for a transaction. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-transaction-merkle-proof)* + * + * Endpoint: `GET /api/tx/{txid}/merkle-proof` + * + * @param {Txid} txid + * @param {{ signal?: AbortSignal, onValue?: (value: MerkleProof) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getTxMerkleProof(txid, { signal, onValue, cache } = {}) { + const path = `/api/tx/${txid}/merkle-proof`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Output spend status + * + * Get the spending status of a transaction output. Returns whether the output has been spent and, if so, the spending transaction details. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-transaction-outspend)* + * + * Endpoint: `GET /api/tx/{txid}/outspend/{vout}` + * + * @param {Txid} txid - Transaction ID + * @param {Vout} vout - Output index + * @param {{ signal?: AbortSignal, onValue?: (value: TxOutspend) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getTxOutspend(txid, vout, { signal, onValue, cache } = {}) { + const path = `/api/tx/${txid}/outspend/${vout}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * All output spend statuses + * + * Get the spending status of all outputs in a transaction. Returns an array with the spend status for each output. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-transaction-outspends)* + * + * Endpoint: `GET /api/tx/{txid}/outspends` + * + * @param {Txid} txid + * @param {{ signal?: AbortSignal, onValue?: (value: TxOutspend[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getTxOutspends(txid, { signal, onValue, cache } = {}) { + const path = `/api/tx/${txid}/outspends`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Transaction raw + * + * Returns a transaction as binary data. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-transaction-raw)* + * + * Endpoint: `GET /api/tx/{txid}/raw` + * + * @param {Txid} txid + * @param {{ signal?: AbortSignal, onValue?: (value: Uint8Array) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getTxRaw(txid, { signal, onValue, cache } = {}) { + const path = `/api/tx/${txid}/raw`; + return this.getBytes(path, { signal, onValue, cache }); + } + + /** + * Transaction status + * + * Retrieve the confirmation status of a transaction. Returns whether the transaction is confirmed and, if so, the block height, hash, and timestamp. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-transaction-status)* + * + * Endpoint: `GET /api/tx/{txid}/status` + * + * @param {Txid} txid + * @param {{ signal?: AbortSignal, onValue?: (value: TxStatus) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getTxStatus(txid, { signal, onValue, cache } = {}) { + const path = `/api/tx/${txid}/status`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Transaction first-seen times + * + * Returns timestamps when transactions were first seen in the mempool. Returns 0 for mined or unknown transactions. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-transaction-times)* + * + * Endpoint: `GET /api/v1/transaction-times` + * + * @param {Txid[]} txId - Transaction IDs to look up (max 250 per request). + * @param {{ signal?: AbortSignal, onValue?: (value: number[]) => void, cache?: boolean }} [options] + * @returns {Promise} + */ + async getTransactionTimes(txId, { signal, onValue, cache } = {}) { + const params = new URLSearchParams(); + for (const _v of txId) params.append('txId[]', String(_v)); + const query = params.toString(); + const path = `/api/v1/transaction-times${query ? '?' + query : ''}`; + return this.getJson(path, { signal, onValue, cache }); + } + + /** + * Broadcast transaction + * + * Broadcast a raw transaction to the network. The transaction should be provided as hex in the request body. The txid will be returned on success. + * + * *[Mempool.space docs](https://mempool.space/docs/api/rest#post-transaction)* + * + * Endpoint: `POST /api/tx` + * + * @param {string} body - Request body + * @param {{ signal?: AbortSignal }} [options] + * @returns {Promise} + */ + async postTx(body, { signal } = {}) { + const path = `/api/tx`; + return this.postJson(path, body, { signal }); + } + + /** + * OpenAPI specification + * + * Full OpenAPI 3.1 specification for this API. + * + * Endpoint: `GET /openapi.json` + * @param {{ signal?: AbortSignal, onValue?: (value: *) => void, cache?: boolean }} [options] + * @returns {Promise<*>} + */ + async getOpenapi({ signal, onValue, cache } = {}) { + const path = `/openapi.json`; + return this.getText(path, { signal, onValue, cache }); + } + + /** + * Compact OpenAPI specification + * + * Compact OpenAPI specification optimized for LLM consumption. Removes redundant fields while preserving essential API information. Full spec available at `/openapi.json`. + * + * Endpoint: `GET /api.json` + * @param {{ signal?: AbortSignal, onValue?: (value: *) => void, cache?: boolean }} [options] + * @returns {Promise<*>} + */ + async getApi({ signal, onValue, cache } = {}) { + const path = `/api.json`; + return this.getJson(path, { signal, onValue, cache }); + } + +} + +export { BrkClient, BrkError }; diff --git a/website_bkp/scripts/modules/brk-client/jsconfig.json b/website_bkp/scripts/modules/brk-client/jsconfig.json new file mode 100644 index 000000000..cffb39bbd --- /dev/null +++ b/website_bkp/scripts/modules/brk-client/jsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "checkJs": true, + "strict": true, + "target": "ESNext", + "module": "ESNext", + "skipLibCheck": true + }, + "exclude": ["dist"] +} diff --git a/website_bkp/scripts/modules/brk-client/package.json b/website_bkp/scripts/modules/brk-client/package.json new file mode 100644 index 000000000..b5a0e8ec0 --- /dev/null +++ b/website_bkp/scripts/modules/brk-client/package.json @@ -0,0 +1,44 @@ +{ + "bugs": { + "url": "https://github.com/bitcoinresearchkit/brk/issues" + }, + "scripts": { + "test": "node tests/basic.js && node tests/tree.js", + "test:basic": "node tests/basic.js", + "test:tree": "node tests/tree.js" + }, + "description": "Bitcoin on-chain analytics client — thousands of metrics, block explorer, and address index", + "engines": { + "node": ">=18" + }, + "exports": { + ".": "./index.js" + }, + "files": [ + "index.js", + "generated" + ], + "homepage": "https://github.com/bitcoinresearchkit/brk/tree/main/modules/brk-client", + "keywords": [ + "brk", + "bitcoin", + "blockchain", + "research", + "on-chain", + "analytics", + "metrics", + "api", + "data", + "cryptocurrency" + ], + "license": "MIT", + "main": "index.js", + "name": "brk-client", + "repository": { + "directory": "modules/brk-client", + "type": "git", + "url": "git+https://github.com/bitcoinresearchkit/brk.git" + }, + "type": "module", + "version": "0.3.1" +} diff --git a/website_bkp/scripts/modules/brk-client/tests/basic.js b/website_bkp/scripts/modules/brk-client/tests/basic.js new file mode 100644 index 000000000..3dbe83b4a --- /dev/null +++ b/website_bkp/scripts/modules/brk-client/tests/basic.js @@ -0,0 +1,66 @@ +import { BrkClient } from "../index.js"; + +const client = new BrkClient("http://localhost:3110"); + +console.log("Testing idiomatic API...\n"); + +// Test getter access (property) +console.log("1. Getter access (.by.dateindex):"); +const all = await client.series.prices.split.close.usd.by.day1; +console.log(` Got: ${all.data.length} items\n`); + +// Test dynamic access (bracket notation) +console.log("2. Dynamic access (.by['dateindex']):"); +const allDynamic = await client.series.prices.split.close.usd.by.day1; +console.log(` Got: ${allDynamic.data.length} items\n`); + +// Test fetch all (explicit .fetch()) +console.log("3. Explicit .fetch():"); +const allExplicit = await client.series.prices.split.close.usd.by.day1.fetch(); +console.log(` Got: ${allExplicit.data.length} items\n`); + +// Test first(n) +console.log("4. First 5 items (.first(5)):"); +const first5 = await client.series.prices.split.close.usd.by.day1.first(5); +console.log( + ` Start: ${first5.start}, End: ${first5.end}, Got: ${first5.data.length} items\n`, +); + +// Test last(n) +console.log("5. Last 5 items (.last(5)):"); +const last5 = await client.series.prices.split.close.usd.by.day1.last(5); +console.log( + ` Start: ${last5.start}, End: ${last5.end}, Got: ${last5.data.length} items\n`, +); + +// Test slice(start, end) +console.log("6. Slice 10-20 (.slice(10, 20)):"); +const sliced = await client.series.prices.split.close.usd.by.day1.slice(10, 20); +console.log( + ` Start: ${sliced.start}, End: ${sliced.end}, Got: ${sliced.data.length} items\n`, +); + +// Test get(index) - single item +console.log("7. Single item (.get(100)):"); +const single = await client.series.prices.split.close.usd.by.day1.get(100); +console.log( + ` Start: ${single.start}, End: ${single.end}, Got: ${single.data.length} item(s)\n`, +); + +// Test skip(n).take(m) chaining +console.log("8. Skip and take (.skip(100).take(10)):"); +const skipTake = await client.series.prices.split.close.usd.by.day1 + .skip(100) + .take(10); +console.log( + ` Start: ${skipTake.start}, End: ${skipTake.end}, Got: ${skipTake.data.length} items\n`, +); + +// Test fetchCsv +console.log("9. Fetch as CSV (.last(3).fetchCsv()):"); +const csv = await client.series.prices.split.close.usd.by.day1 + .last(3) + .fetchCsv(); +console.log(` CSV preview: ${csv.substring(0, 100)}...\n`); + +console.log("All tests passed!"); diff --git a/website_bkp/scripts/modules/brk-client/tests/consistency.js b/website_bkp/scripts/modules/brk-client/tests/consistency.js new file mode 100644 index 000000000..5014f534d --- /dev/null +++ b/website_bkp/scripts/modules/brk-client/tests/consistency.js @@ -0,0 +1,132 @@ +/** + * Consistency test: verifies that all series sharing the same index have the same length. + * Useful for catching stale/inconsistent state after a reorg rollback. + */ + +import { BrkClient } from "../index.js"; + +/** + * @typedef {import('../index.js').AnySeriesPattern} AnyMetricPattern + */ + +/** + * @param {any} obj + * @returns {obj is AnyMetricPattern} + */ +function isMetricPattern(obj) { + return ( + obj && + typeof obj === "object" && + typeof obj.indexes === "function" && + obj.by && + typeof obj.by === "object" + ); +} + +/** + * Recursively collect all metric patterns from the tree. + * @param {Record} obj + * @param {string} path + * @returns {Array<{path: string, metric: AnyMetricPattern}>} + */ +function getAllMetrics(obj, path = "") { + /** @type {Array<{path: string, metric: AnyMetricPattern}>} */ + const metrics = []; + + for (const key of Object.keys(obj)) { + const attr = obj[key]; + if (!attr || typeof attr !== "object") continue; + + const currentPath = path ? `${path}.${key}` : key; + + if (isMetricPattern(attr)) { + metrics.push({ path: currentPath, metric: attr }); + } + + if (typeof attr === "object" && !Array.isArray(attr)) { + metrics.push(...getAllMetrics(attr, currentPath)); + } + } + + return metrics; +} + +async function testConsistency() { + const client = new BrkClient({ + baseUrl: "http://localhost:3110", + timeout: 15000, + }); + + const metrics = getAllMetrics(client.series); + console.log(`\nFound ${metrics.length} metrics`); + + /** @type {Map>} */ + const byIndex = new Map(); + + for (const { path, metric } of metrics) { + const indexes = metric.indexes(); + + for (const idxName of indexes) { + const fullPath = `${path}.by.${idxName}`; + const endpoint = metric.by[idxName]; + + if (!endpoint) { + console.log(`SKIP: ${fullPath} (undefined endpoint)`); + continue; + } + + try { + const result = await endpoint.last(0); + const total = result.end; + + if (!byIndex.has(idxName)) { + byIndex.set(idxName, []); + } + /** @type {Array<{path: string, total: number}>} */ (byIndex.get(idxName)).push({ path: fullPath, total }); + } catch (e) { + console.log( + `FAIL: ${fullPath} -> ${e instanceof Error ? e.message : e}`, + ); + return; + } + } + } + + let failed = false; + + for (const [index, entries] of byIndex) { + const totals = new Set(entries.map((e) => e.total)); + + if (totals.size === 1) { + const [total] = totals; + console.log(`OK: ${index} — ${entries.length} series, all length ${total}`); + continue; + } + + failed = true; + console.log(`\nMISMATCH: ${index} — ${entries.length} series with ${totals.size} different lengths:`); + + /** @type {Map} */ + const grouped = new Map(); + for (const { path, total } of entries) { + if (!grouped.has(total)) grouped.set(total, []); + /** @type {string[]} */ (grouped.get(total)).push(path); + } + + for (const [total, paths] of [...grouped].sort((a, b) => b[0] - a[0])) { + console.log(` length ${total}: (${paths.length} series)`); + for (const p of paths) { + console.log(` ${p}`); + } + } + } + + if (failed) { + console.log("\nFAILED: length mismatches detected"); + throw new Error("length mismatches detected"); + } else { + console.log("\nPASSED: all indexes consistent"); + } +} + +testConsistency(); diff --git a/website_bkp/scripts/modules/brk-client/tests/metric_data.js b/website_bkp/scripts/modules/brk-client/tests/metric_data.js new file mode 100644 index 000000000..d8497af5a --- /dev/null +++ b/website_bkp/scripts/modules/brk-client/tests/metric_data.js @@ -0,0 +1,248 @@ +/** + * Tests for MetricData helper methods and date conversion functions. + * Run: node tests/metric_data.js + */ + +import { BrkClient } from "../index.js"; + +const client = new BrkClient("http://localhost:3110"); + +console.log("Testing MetricData helpers...\n"); + +// Fetch a date-based metric +console.log("1. Fetching price data (day1):"); +const price = await client.series.prices.split.close.usd.by.day1.first(5); +console.log(` Start: ${price.start}, End: ${price.end}`); + +// Test isDateBased +console.log("\n2. isDateBased:"); +if (!price.isDateBased) throw new Error("day1 should be date-based"); +console.log(` day1: ${price.isDateBased}`); + +// Test indexes() - always returns numbers +console.log("\n3. indexes():"); +const indexes = price.indexes(); +console.log(` ${JSON.stringify(indexes)}`); +if (indexes.length !== 5) throw new Error("Expected 5 indexes"); +if (indexes[0] !== price.start) + throw new Error("First index should equal start"); + +// Test dates() - DateMetricData method +console.log("\n4. dates():"); +const dates = price.dates(); +console.log( + ` First: ${dates[0].toISOString()}, Last: ${dates[dates.length - 1].toISOString()}`, +); +if (dates.length !== 5) throw new Error("Expected 5 dates"); +// DateIndex 0 = Jan 3, 2009 (genesis) +if ( + dates[0].getFullYear() !== 2009 || + dates[0].getMonth() !== 0 || + dates[0].getDate() !== 3 +) { + throw new Error( + `Expected genesis date (2009-01-03), got ${dates[0].toISOString()}`, + ); +} + +// Test keys() - always returns numbers (alias for indexes) +console.log("\n5. keys():"); +const keys = price.keys(); +if (keys.length !== 5) throw new Error("Expected 5 keys"); +if (typeof keys[0] !== "number") throw new Error("Expected number keys"); +console.log(` Length: ${keys.length}, First: ${keys[0]}`); + +// Test entries() - returns [number, value] pairs +console.log("\n6. entries():"); +const entries = price.entries(); +if (typeof entries[0][0] !== "number") + throw new Error("Expected number entry key"); +console.log(` First: [${entries[0][0]}, ${entries[0][1]}]`); +if (entries[0][1] !== price.data[0]) + throw new Error("First entry value mismatch"); + +// Test dateEntries() - DateMetricData method, returns [Date, value] pairs +console.log("\n7. dateEntries():"); +const dateEntries = price.dateEntries(); +if (!(dateEntries[0][0] instanceof Date)) + throw new Error("Expected Date entry key"); +console.log( + ` First: [${dateEntries[0][0].toISOString()}, ${dateEntries[0][1]}]`, +); + +// Test toMap() - returns Map +console.log("\n8. toMap():"); +const map = price.toMap(); +console.log(` Size: ${map.size}`); +if (map.size !== 5) throw new Error("Expected map size 5"); + +// Test toDateMap() - DateMetricData method +console.log("\n9. toDateMap():"); +const dateMap = price.toDateMap(); +console.log(` Size: ${dateMap.size}`); +if (dateMap.size !== 5) throw new Error("Expected date map size 5"); + +// Test Symbol.iterator (for...of) - yields [number, value] +console.log("\n10. for...of iteration:"); +let count = 0; +for (const [key, _val] of price) { + if (count === 0 && typeof key !== "number") + throw new Error("Expected number keys in iteration"); + count++; +} +console.log(` Iterated ${count} items`); +if (count !== 5) throw new Error("Expected 5 iterations"); + +// Test with non-date-based index (height) +console.log("\n11. Testing height-based metric:"); +const heightMetric = await client.series.prices.spot.usd.by.height.last(3); +console.log(` Start: ${heightMetric.start}, End: ${heightMetric.end}`); +if (heightMetric.isDateBased) + throw new Error("height should not be date-based"); + +// Test keys() - always numbers +const heightKeys = heightMetric.keys(); +console.log(` keys(): ${JSON.stringify(heightKeys)}`); +if (typeof heightKeys[0] !== "number") + throw new Error("Expected number keys for height"); + +// Test entries() - [number, value] +const heightEntries = heightMetric.entries(); +console.log( + ` entries()[0]: [${heightEntries[0][0]}, ${heightEntries[0][1]}]`, +); +if (heightEntries[0][0] !== heightMetric.start) + throw new Error("First entry index mismatch"); + +// Test toMap() - Map +const heightMap = heightMetric.toMap(); +if (heightMap.size !== 3) throw new Error("Expected map size 3"); +if (heightMap.get(heightMetric.start) !== heightMetric.data[0]) + throw new Error("First value mismatch"); + +// Test for...of on non-date metric +console.log("\n12. for...of iteration (height):"); +let heightCount = 0; +for (const [key, _val] of heightMetric) { + if (heightCount === 0 && typeof key !== "number") + throw new Error("Expected number keys for height iteration"); + heightCount++; +} +console.log(` Iterated ${heightCount} items`); + +// Test different date indexes +console.log("\n13. Testing month1:"); +const monthMetric = + await client.series.prices.split.close.usd.by.month1.first(3); +const monthDates = monthMetric.dates(); +console.log(` First month: ${monthDates[0].toISOString()}`); +// MonthIndex 0 = Jan 1, 2009 +if ( + monthDates[0].getFullYear() !== 2009 || + monthDates[0].getMonth() !== 0 || + monthDates[0].getDate() !== 1 +) { + throw new Error(`Expected 2009-01-01, got ${monthDates[0].toISOString()}`); +} + +// Test indexToDate directly +console.log("\n14. Testing indexToDate():"); +const genesis = client.indexToDate("day1", 0); +if ( + genesis.getFullYear() !== 2009 || + genesis.getMonth() !== 0 || + genesis.getDate() !== 3 +) { + throw new Error(`Expected genesis 2009-01-03, got ${genesis.toISOString()}`); +} +const dayOne = client.indexToDate("day1", 1); +if ( + dayOne.getFullYear() !== 2009 || + dayOne.getMonth() !== 0 || + dayOne.getDate() !== 9 +) { + throw new Error(`Expected day one 2009-01-09, got ${dayOne.toISOString()}`); +} +console.log(` day1 0: ${genesis.toISOString()}`); +console.log(` day1 1: ${dayOne.toISOString()}`); + +// Test week1 +const week0 = client.indexToDate("week1", 0); +const week1 = client.indexToDate("week1", 1); +if (week0.getTime() !== genesis.getTime()) + throw new Error("week1 0 should equal genesis"); +console.log(` week1 0: ${week0.toISOString()}`); +console.log(` week1 1: ${week1.toISOString()}`); + +// Test year1 +const year0 = client.indexToDate("year1", 0); +const year1 = client.indexToDate("year1", 1); +if ( + year0.getFullYear() !== 2009 || + year0.getMonth() !== 0 || + year0.getDate() !== 1 +) { + throw new Error(`Expected 2009-01-01, got ${year0.toISOString()}`); +} +if (year1.getFullYear() !== 2010) throw new Error("year1 1 should be 2010"); +console.log(` year1 0: ${year0.toISOString()}`); +console.log(` year1 1: ${year1.toISOString()}`); + +// Test month3 +const q0 = client.indexToDate("month3", 0); +const q1 = client.indexToDate("month3", 1); +if (q0.getMonth() !== 0) throw new Error("month3 0 should be January"); +if (q1.getMonth() !== 3) throw new Error("month3 1 should be April"); +console.log(` month3 0: ${q0.toISOString()}`); +console.log(` month3 1: ${q1.toISOString()}`); + +// Test month6 +const s0 = client.indexToDate("month6", 0); +const s1 = client.indexToDate("month6", 1); +if (s0.getMonth() !== 0) throw new Error("month6 0 should be January"); +if (s1.getMonth() !== 6) throw new Error("month6 1 should be July"); +console.log(` month6 0: ${s0.toISOString()}`); +console.log(` month6 1: ${s1.toISOString()}`); + +// Test year10 +const d0 = client.indexToDate("year10", 0); +const d1 = client.indexToDate("year10", 1); +if (d0.getFullYear() !== 2009) throw new Error("year10 0 should be 2009"); +if (d1.getFullYear() !== 2019) throw new Error("year10 1 should be 2019"); +console.log(` year10 0: ${d0.toISOString()}`); +console.log(` year10 1: ${d1.toISOString()}`); + +// Test dateToIndex +console.log("\n15. Testing dateToIndex():"); +const idx = client.dateToIndex("day1", new Date(Date.UTC(2009, 0, 9))); +if (idx !== 1) throw new Error(`Expected day1 index 1, got ${idx}`); +console.log(` day1 2009-01-09: ${idx}`); + +const monthIdx = client.dateToIndex("month1", new Date(Date.UTC(2010, 0, 1))); +if (monthIdx !== 12) + throw new Error(`Expected month1 index 12, got ${monthIdx}`); +console.log(` month1 2010-01-01: ${monthIdx}`); + +const yearIdx = client.dateToIndex("year1", new Date(Date.UTC(2019, 0, 1))); +if (yearIdx !== 10) throw new Error(`Expected year1 index 10, got ${yearIdx}`); +console.log(` year1 2019-01-01: ${yearIdx}`); + +// Test roundtrip: indexToDate -> dateToIndex +const testDate = client.indexToDate("day1", 100); +const roundtrip = client.dateToIndex("day1", testDate); +if (roundtrip !== 100) + throw new Error(`Roundtrip failed: expected 100, got ${roundtrip}`); +console.log(` Roundtrip day1 100: ${testDate.toISOString()} -> ${roundtrip}`); + +// Test slice with Date +console.log("\n16. Testing slice with Date:"); +const dateSlice = await client.series.prices.split.close.usd.by.day1 + .slice(new Date(Date.UTC(2020, 0, 1)), new Date(Date.UTC(2020, 0, 4))) + .fetch(); +console.log( + ` Slice start: ${dateSlice.start}, end: ${dateSlice.end}, items: ${dateSlice.data.length}`, +); +if (dateSlice.data.length !== dateSlice.end - dateSlice.start) + throw new Error("Slice data length mismatch"); + +console.log("\nAll MetricData tests passed!"); diff --git a/website_bkp/scripts/modules/brk-client/tests/tree.js b/website_bkp/scripts/modules/brk-client/tests/tree.js new file mode 100644 index 000000000..03914f71a --- /dev/null +++ b/website_bkp/scripts/modules/brk-client/tests/tree.js @@ -0,0 +1,102 @@ +/** + * Comprehensive test that fetches all endpoints in the tree. + */ + +import { BrkClient } from "../index.js"; + +/** + * @typedef {import('../index.js').AnySeriesPattern} AnyMetricPattern + */ + +/** + * Check if an object is a metric pattern (has indexes() method and by object). + * @param {any} obj + * @returns {obj is AnyMetricPattern} + */ +function isMetricPattern(obj) { + return ( + obj && + typeof obj === "object" && + typeof obj.indexes === "function" && + obj.by && + typeof obj.by === "object" + ); +} + +/** + * Recursively collect all metric patterns from the tree. + * @param {Record} obj + * @param {string} path + * @returns {Array<{path: string, metric: AnyMetricPattern}>} + */ +function getAllMetrics(obj, path = "") { + /** @type {Array<{path: string, metric: AnyMetricPattern}>} */ + const metrics = []; + + for (const key of Object.keys(obj)) { + const attr = obj[key]; + if (!attr || typeof attr !== "object") continue; + + const currentPath = path ? `${path}.${key}` : key; + + // Check if this is a metric pattern using the indexes() method + if (isMetricPattern(attr)) { + metrics.push({ path: currentPath, metric: attr }); + } + + // Recurse into nested tree nodes + if (typeof attr === "object" && !Array.isArray(attr)) { + metrics.push(...getAllMetrics(attr, currentPath)); + } + } + + return metrics; +} + +async function testAllEndpoints() { + const client = new BrkClient({ + baseUrl: "http://localhost:3110", + timeout: 15000, + }); + + const metrics = getAllMetrics(client.series); + console.log(`\nFound ${metrics.length} metrics`); + + let success = 0; + + for (const { path, metric } of metrics) { + // Use the indexes() method to get all available indexes + const indexes = metric.indexes(); + + for (const idxName of indexes) { + const fullPath = `${path}.by.${idxName}`; + + try { + // Verify both access methods work: .by[index] and .get(index) + const endpointByProperty = metric.by[idxName]; + const endpointByGet = metric.get(idxName); + + if (!endpointByProperty) { + throw new Error(`metric.by.${idxName} is undefined`); + } + if (!endpointByGet) { + throw new Error(`metric.get('${idxName}') returned undefined`); + } + + await endpointByProperty.last(0); + success++; + console.log(`OK: ${fullPath}`); + } catch (e) { + console.log( + `FAIL: ${fullPath} -> ${e instanceof Error ? e.message : e}`, + ); + return; + } + } + } + + console.log(`\n=== Results ===`); + console.log(`Success: ${success}`); +} + +testAllEndpoints(); diff --git a/website_bkp/scripts/modules/brk-client/tsconfig.json b/website_bkp/scripts/modules/brk-client/tsconfig.json new file mode 100644 index 000000000..6ac44303e --- /dev/null +++ b/website_bkp/scripts/modules/brk-client/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "strict": true, + "target": "ESNext", + "module": "ESNext", + "outDir": "/tmp/brk", + "lib": ["DOM", "DOM.Iterable", "ESNext", "WebWorker"], + "skipLibCheck": true + }, + "exclude": ["dist", "tests"] +} diff --git a/website_bkp/scripts/modules/lean-qr/.gitignore b/website_bkp/scripts/modules/lean-qr/.gitignore new file mode 100644 index 000000000..a6c7c2852 --- /dev/null +++ b/website_bkp/scripts/modules/lean-qr/.gitignore @@ -0,0 +1 @@ +*.js diff --git a/website_bkp/scripts/modules/lean-qr/2.7.1/index.d.ts b/website_bkp/scripts/modules/lean-qr/2.7.1/index.d.ts new file mode 100644 index 000000000..e5856704e --- /dev/null +++ b/website_bkp/scripts/modules/lean-qr/2.7.1/index.d.ts @@ -0,0 +1,653 @@ +declare module 'lean-qr' { + interface ImageDataLike { + readonly data: Uint8ClampedArray; + } + + interface Context2DLike { + createImageData(width: number, height: number): DataT; + putImageData(data: DataT, x: number, y: number): void; + } + + interface CanvasLike { + width: number; + height: number; + getContext(type: '2d'): Context2DLike | null; + } + + /** + * A colour in `[red, green, blue, alpha]` format (all values from 0 to 255). + * If alpha is omitted, it is assumed to be 255 (opaque). + */ + export type RGBA = readonly [number, number, number, number?]; + + export interface Bitmap1D { + /** + * Appends a sequence of bits. + * + * @param value an integer containing the bits to append (big endian). + * @param bits the number of bits to read from `value`. Must be between 1 and 24. + */ + push(value: number, bits: number): void; + } + + export interface StringOptions { + /** the text to use for modules which are 'on' (typically black) */ + on?: string; + + /** the text to use for modules which are 'off' (typically white) */ + off?: string; + + /** the text to use for linefeeds between rows */ + lf?: string; + + /** the padding to apply around the output (populated with 'off' modules) */ + pad?: number; + + /** + * the padding to apply on the left and right of the output (populated with 'off' modules) + * @deprecated use `pad` instead + */ + padX?: number; + + /** + * the padding to apply on the top and bottom of the output (populated with 'off' modules) + * @deprecated use `pad` instead + */ + padY?: number; + } + + export interface ImageDataOptions { + /** the colour to use for modules which are 'on' (typically black) */ + on?: RGBA; + + /** the colour to use for modules which are 'off' (typically white) */ + off?: RGBA; + + /** the padding to apply around the output (filled with 'off') */ + pad?: number; + + /** + * the padding to apply on the left and right of the output (filled with 'off') + * @deprecated use `pad` instead + */ + padX?: number; + + /** + * the padding to apply on the top and bottom of the output (filled with 'off') + * @deprecated use `pad` instead + */ + padY?: number; + } + + export interface Bitmap2D { + /** the width / height of the QR code in modules (excluding any padding) */ + readonly size: number; + + /** + * Read the state of a module from the QR code. + * + * @param x the x coordinate to read. Can be negative / out of bounds. + * @param y the y coordinate to read. Can be negative / out of bounds. + * @returns true if the requested module is set (i.e. typically black) + */ + get(x: number, y: number): boolean; + + /** + * Generate a string containing the QR code, suitable for displaying in a + * terminal environment. Generally, you should customise on and off to use + * the ANSI escapes of your target terminal for better rendering. + * + * @param options optional configuration for the display. + */ + toString(options?: Readonly): string; + + /** + * Generate image data containing the QR code, at a scale of 1 pixel per + * module. Use this if you need more control than toCanvas allows. + * + * @param context a context to use for creating the image data. + * @param options optional configuration for the display. + */ + toImageData( + context: Context2DLike, + options?: Readonly, + ): DataT; + + /** + * Generate a `data:image/*` URL for the QR code. + * + * @param options optional configuration for the output. + * @returns a string suitable for use as the `src` of an `img` tag. + */ + toDataURL( + options?: Readonly< + ImageDataOptions & { + type?: `image/${string}`; + scale?: number; + } + >, + ): string; + + /** + * Populate a given canvas with the QR code, at a scale of 1 pixel per + * module. Set image-rendering: pixelated and scale the canvas using CSS + * for a large image. Automatically resizes the canvas to fit the QR code + * if necessary. + * + * @param canvas the canvas to populate. + * @param options optional configuration for the display. + */ + toCanvas( + canvas: CanvasLike, + options?: Readonly, + ): void; + } + + export type Mask = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7; + export type Mode = (data: Bitmap1D, version: number) => void; + export interface ModeFactory { + (value: string): Mode; + /** a function which returns true when given a character which the current mode can represent */ + test(string: string): boolean; + /** a function which returns an estimate of the number of bits required to encode a given value */ + est(value: string, version: number): number; + /** an optional ECI which must be active for this mode to be interpreted correctly by a reader */ + eci?: number; + } + + interface ModeAutoOptions { + /** a list of modes which can be considered when encoding a message */ + modes?: ReadonlyArray; + } + + export const mode: Readonly<{ + /** automatically picks the most optimal combination of modes for the requested message */ + auto(value: string, options?: Readonly): Mode; + /** concatenates multiple modes together */ + multi(...modes: ReadonlyArray): Mode; + /** sets the Extended Channel Interpretation for the message from this point onwards */ + eci(id: number): Mode; + /** supports `0-9` and stores 3 characters per 10 bits */ + numeric: ModeFactory; + /** supports `0-9A-Z $%*+-./:` and stores 2 characters per 11 bits */ + alphaNumeric: ModeFactory; + /** arbitrary byte data, typically combined with `eci` */ + bytes(data: Uint8Array | ReadonlyArray): Mode; + /** supports 7-bit ASCII and stores 1 character per 8 bits with no ECI */ + ascii: ModeFactory; + /** supports 8-bit ISO-8859-1 and stores 1 character per 8 bits with ECI 3 */ + iso8859_1: ModeFactory; + /** supports double-byte Shift-JIS characters stores 1 character per 13 bits */ + shift_jis: ModeFactory; + /** supports variable length UTF-8 with ECI 26 */ + utf8: ModeFactory; + }>; + + export type Correction = number & { readonly _: unique symbol }; + export const correction: Readonly<{ + /** + * minimum possible correction level (same as L) + * @deprecated use correction.L + */ + min: Correction; + /** ~7.5% error tolerance, ~25% data overhead */ + L: Correction; + /** ~15% error tolerance, ~60% data overhead */ + M: Correction; + /** ~22.5% error tolerance, ~120% data overhead */ + Q: Correction; + /** ~30% error tolerance, ~190% data overhead */ + H: Correction; + /** + * maximum possible correction level (same as H) + * @deprecated use correction.H + */ + max: Correction; + }>; + + export interface GenerateOptions extends ModeAutoOptions { + /** the minimum correction level to use (higher levels may still be used if the chosen version has space) */ + minCorrectionLevel?: Correction; + /** the maximum correction level to use */ + maxCorrectionLevel?: Correction; + /** the minimum version (size) of code to generate (must be between 1 and 40) */ + minVersion?: number; + /** the maximum version (size) of code to generate (must be between 1 and 40) */ + maxVersion?: number; + /** a mask to use on the QR code (should be left as `null` for ISO compliance but may be changed for artistic effect) */ + mask?: null | Mask; + /** padding bits to use for extra space in the QR code (should be left as the default for ISO compliance but may be changed for artistic effect) */ + trailer?: number; + } + + /** + * Generate a QR code. + * + * @param data either a string, or a pre-encoded mode. + * @param options optional configuration for the QR code. + * @returns the requested QR code. + */ + export type GenerateFn = ( + data: Mode | string, + options?: Readonly, + ) => Bitmap2D; + interface Generate extends GenerateFn { + /** + * Creates a scoped `generate` function which considers additional modes + * when using auto encoding. + * + * @param modes the modes to add. + * @returns a `generate` function which will additionally consider the + * given modes when using auto encoding. + * + * @deprecated this will be removed in version 3. Prefer passing an explicit list of modes when calling `generate`. + */ + with(...modes: ReadonlyArray): GenerateFn; + } + export const generate: Generate; +} + +declare module 'lean-qr/nano' { + import type { + Correction, + Bitmap2D as FullBitmap2D, + GenerateOptions as FullGenerateOptions, + } from 'lean-qr'; + import { correction as fullCorrection } from 'lean-qr'; + + export type { Correction }; + + export const correction: Pick; + + export type Bitmap2D = Pick; + + export type GenerateOptions = Pick< + FullGenerateOptions, + 'minCorrectionLevel' | 'minVersion' + >; + + /** + * Generate a QR code. + * + * @param data either a string, or a pre-encoded mode. + * @param options optional configuration for the QR code. + * @returns the requested QR code. + */ + export function generate( + data: string, + options?: Readonly, + ): Bitmap2D; +} + +declare module 'lean-qr/extras/svg' { + import type { Bitmap2D as FullBitmap2D } from 'lean-qr'; + + type Bitmap2D = Pick; + + export interface SVGOptions { + /** the colour to use for modules which are 'on' (typically black) */ + on?: string; + /** the colour to use for modules which are 'off' (typically white) */ + off?: string; + /** the padding to apply around the output (filled with 'off') */ + pad?: number; + /** + * the padding to apply on the left and right of the output (filled with 'off') + * @deprecated use `pad` instead + */ + padX?: number; + /** + * the padding to apply on the top and bottom of the output (filled with 'off') + * @deprecated use `pad` instead + */ + padY?: number; + /** a width to apply to the resulting image (overrides `scale`) */ + width?: number | null; + /** a height to apply to the resulting image (overrides `scale`) */ + height?: number | null; + /** a scale to apply to the resulting image (`scale` pixels = 1 module) */ + scale?: number; + } + + /** + * Generate the raw outline of the QR code for use in an existing SVG. + * + * @param code the QR code to convert. + * @returns a string suitable for passing to the `d` attribute of a `path`. + */ + export function toSvgPath(code: Bitmap2D): string; + + /** + * Generate an SVG element which can be added to the DOM. + * + * @param code the QR code to convert. + * @param options optional configuration for the display. + * @returns an SVG element. + */ + export function toSvg( + code: Bitmap2D, + target: Document | SVGElement, + options?: Readonly, + ): SVGElement; + + /** + * Generate an SVG document which can be exported to a file or served from a + * web server. + * + * @param code the QR code to convert. + * @param options optional configuration for the display. + * @returns an SVG document. + */ + export function toSvgSource( + code: Bitmap2D, + options?: Readonly< + SVGOptions & { + /** `true` to include an XML declaration at the start of the source (for standalone documents which will not be embedded inside another document) */ + xmlDeclaration?: boolean; + } + >, + ): string; + + /** + * Generate a `data:image/svg+xml` URL. + * + * @param code the QR code to convert. + * @param options optional configuration for the display. + * @returns a string suitable for use as the `src` of an `img` tag. + */ + export function toSvgDataURL( + code: Bitmap2D, + options?: Readonly, + ): string; +} + +declare module 'lean-qr/extras/node_export' { + import type { RGBA, Bitmap2D as FullBitmap2D } from 'lean-qr'; + + type Bitmap2D = Pick; + + export interface PNGOptions { + /** the colour to use for modules which are 'on' (typically black) */ + on?: RGBA; + /** the colour to use for modules which are 'off' (typically white) */ + off?: RGBA; + /** the padding to apply around the output (filled with 'off') */ + pad?: number; + /** + * the padding to apply on the left and right of the output (filled with 'off') + * @deprecated use `pad` instead + */ + padX?: number; + /** + * the padding to apply on the top and bottom of the output (filled with 'off') + * @deprecated use `pad` instead + */ + padY?: number; + /** a scale to apply to the resulting image (`scale` pixels = 1 module) */ + scale?: number; + } + + /** + * Generate a PNG document which can be exported to a file or served from a + * web server. + * + * @param code the QR code to convert. + * @param options optional configuration for the display. + * @returns a PNG document. + */ + export function toPngBuffer( + code: Bitmap2D, + options?: Readonly, + ): Uint8Array; + + /** + * Generate a `data:image/png` URL. + * + * @param code the QR code to convert. + * @param options optional configuration for the display. + * @returns a string suitable for use as the `src` of an `img` tag. + */ + export function toPngDataURL( + code: Bitmap2D, + options?: Readonly, + ): string; +} + +declare module 'lean-qr/extras/react' { + import type { + Bitmap2D as FullBitmap2D, + GenerateOptions, + ImageDataOptions, + } from 'lean-qr'; + import type { + SVGOptions, + toSvgDataURL as toSvgDataURLFn, + } from 'lean-qr/extras/svg'; + + export interface AsyncFramework { + createElement: ( + type: 'canvas', + props: { + ref: any; + style: { imageRendering: 'pixelated' }; + className: string; + }, + ) => T; + useRef(initialValue: T | null): { readonly current: T | null }; + useEffect(fn: () => void | (() => void), deps: unknown[]): void; + } + + interface QRComponentProps { + content: string; + className?: string; + } + + export interface AsyncQRComponentProps + extends ImageDataOptions, + GenerateOptions, + QRComponentProps {} + + export type AsyncQRComponent = ( + props: Readonly, + ) => T; + + /** + * Generate an asynchronous QR component (rendering to a `canvas`). + * You should call this just once, in the global scope. + * + * ```js + * import * as React from 'react'; + * import { generate } from 'lean-qr'; + * import { makeAsyncComponent } from 'lean-qr/extras/react'; + * const QR = makeAsyncComponent(React, generate); + * ``` + * + * This is not suitable for server-side rendering (use `makeSyncComponent` + * instead). + * + * @param framework the framework to use (e.g. `React`). + * @param generate the `generate` function to use + * (from `lean-qr` or `lean-qr/nano`). + * @param defaultProps optional default properties to apply when the + * component is used (overridden by properties set on use). + * @returns a component which can be rendered elsewhere. + */ + export function makeAsyncComponent( + framework: Readonly>, + generate: ( + data: string, + options?: Readonly, + ) => Pick, + defaultProps?: Readonly>, + ): AsyncQRComponent; + + export interface SyncFramework { + createElement: ( + type: 'img', + props: { + src: string; + style: { imageRendering: 'pixelated' }; + className: string; + }, + ) => T; + useMemo(fn: () => T, deps: unknown[]): T; + } + + export interface SyncQRComponentProps + extends SVGOptions, + GenerateOptions, + QRComponentProps {} + + export type SyncQRComponent = (props: Readonly) => T; + + /** + * Generate a synchronous QR component (rendering to an SVG). + * You should call this just once, in the global scope. + * + * ```js + * import * as React from 'react'; + * import { generate } from 'lean-qr'; + * import { toSvgDataURL } from 'lean-qr/extras/svg'; + * import { makeSyncComponent } from 'lean-qr/extras/react'; + * const QR = makeSyncComponent(React, generate, toSvgDataURL); + * ``` + * + * This is best suited for server-side rendering (prefer + * `makeAsyncComponent` if you only need client-side rendering). + * + * @param framework the framework to use (e.g. `React`). + * @param generate the `generate` function to use + * (from `lean-qr` or `lean-qr/nano`). + * @param toSvgDataURL the `toSvgDataURL` function to use + * (from `lean-qr/extras/svg`). + * @param defaultProps optional default properties to apply when the + * component is used (overridden by properties set on use). + * @returns a component which can be rendered elsewhere. + */ + export function makeSyncComponent( + framework: Readonly>, + generate: ( + data: string, + options?: Readonly, + ) => Pick, + toSvgDataURL: typeof toSvgDataURLFn, + defaultProps?: Readonly>, + ): SyncQRComponent; +} + +declare module 'lean-qr/extras/vue' { + import type { + Bitmap2D as FullBitmap2D, + GenerateOptions, + ImageDataOptions, + } from 'lean-qr'; + import type { + SVGOptions, + toSvgDataURL as toSvgDataURLFn, + } from 'lean-qr/extras/svg'; + + export interface Framework { + h: + | ((type: 'canvas', props: { ref: string; style: string }) => unknown) + | ((type: 'img', props: { src: string; style: string }) => unknown); + } + + interface QRComponentProps { + content: string; + } + + export interface VueCanvasComponentProps + extends ImageDataOptions, + GenerateOptions, + QRComponentProps {} + + type VueComponentDefinition = { + props: { + [k in keyof Props]-?: { + type: { (): Required[k] }; + required: undefined extends Props[k] ? false : true; + }; + }; + } & ThisType; + + /** + * Generate a QR component which renders to a `canvas`. + * You should call this just once, in the global scope. + * + * ```js + * import { h, defineComponent } from 'vue'; + * import { generate } from 'lean-qr'; + * import { makeVueCanvasComponent } from 'lean-qr/extras/vue'; + * export const QR = defineComponent(makeVueCanvasComponent({ h }, generate)); + * ``` + * + * This is not suitable for server-side rendering (use `makeSyncComponent` + * instead). + * + * @param framework the framework to use (e.g. `{ h }`). + * @param generate the `generate` function to use + * (from `lean-qr` or `lean-qr/nano`). + * @param defaultProps optional default properties to apply when the + * component is used (overridden by properties set on use). + * @returns a component which can be rendered elsewhere. + */ + export function makeVueCanvasComponent( + framework: Readonly, + generate: ( + data: string, + options?: Readonly, + ) => Pick, + defaultProps?: Readonly>, + ): VueComponentDefinition; + + export interface VueSVGComponentProps + extends SVGOptions, + GenerateOptions, + QRComponentProps {} + + /** + * Generate a QR component which renders to an SVG. + * You should call this just once, in the global scope: + * + * ```js + * import { h, defineComponent } from 'vue'; + * import { generate } from 'lean-qr'; + * import { toSvgDataURL } from 'lean-qr/extras/svg'; + * import { makeVueSvgComponent } from 'lean-qr/extras/vue'; + * export const QR = defineComponent(makeVueSvgComponent({ h }, generate, toSvgDataURL)); + * ``` + * + * This is best suited for server-side rendering (prefer + * `makeAsyncComponent` if you only need client-side rendering). + * + * @param framework the framework to use (e.g. `{ h }`). + * @param generate the `generate` function to use + * (from `lean-qr` or `lean-qr/nano`). + * @param toSvgDataURL the `toSvgDataURL` function to use + * (from `lean-qr/extras/svg`). + * @param defaultProps optional default properties to apply when the + * component is used (overridden by properties set on use). + * @returns a component which can be rendered elsewhere. + */ + export function makeVueSvgComponent( + framework: Readonly, + generate: ( + data: string, + options?: Readonly, + ) => Pick, + toSvgDataURL: typeof toSvgDataURLFn, + defaultProps?: Readonly>, + ): VueComponentDefinition; +} + +declare module 'lean-qr/extras/errors' { + /** + * Convert an error into a human-readable message. This is intended for use + * with Lean QR errors, but will return somewhat meaningful messages for + * other errors too. + * + * @param error the error to convert. + * @returns a human-readable message explaining the error. + */ + export function readError(error: unknown): string; +} diff --git a/website_bkp/scripts/modules/lean-qr/2.7.1/index.mjs b/website_bkp/scripts/modules/lean-qr/2.7.1/index.mjs new file mode 100644 index 000000000..f8625849e --- /dev/null +++ b/website_bkp/scripts/modules/lean-qr/2.7.1/index.mjs @@ -0,0 +1,2 @@ +// @ts-nocheck +const t = [.2, 3 / 8, 5 / 9, 2 / 3], o = (o, e) => r => { const n = 4 * o + r - 4, s = "*-04-39?2$%%$%%'$%''%'''%')(%'))%(++'(++'(+.'+-.',/3',33)-/5)-43).36)058*18<+37<+4:<,4:E,5C/8@F/:EH/ 8 ? s : 1, c = e / f | 0, i = e % f, l = f - i, a = n > 8 ? c * t[r] + (o > 5) & -2 : s, _ = c - a; return { t: l * _ + i * _ + i, o: [[l, _], [i, _ + 1]], i: a } }, e = { min: 0, L: 0, M: 1, Q: 2, H: 3, max: 3 }, r = t => new Uint8Array(t), n = t => { const o = new Error(`lean-qr error ${t}`); throw o.code = t, o }, s = t => "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:".indexOf(t), f = t => t.charCodeAt(0), c = (...t) => (o, e) => t.forEach(t => t(o, e)), i = t => o => { o.eci !== t && (o.push(7, 4), t < 128 ? o.push(t, 8) : t < 16384 ? o.push(32768 | t, 16) : o.push(12582912 | t, 24), o.eci = t) }, l = t => (o, e) => { o.push(4, 4), o.push(t.length, 8 + 8 * (e > 9)), t.forEach(t => o.push(t, 8)) }, a = (t, o, e, r, n = (t, o) => e(t.length, o), s = (r ? o => c(i(r), t(o)) : t)) => (s.test = o, s.l = e, s.est = n, s.eci = r && [r], s), _ = a(t => (o, e) => { o.push(1, 4), o.push(t.length, 10 + 2 * (e > 26) + 2 * (e > 9)); let r = 0; for (; r < t.length - 2; r += 3)o.push(+t.slice(r, r + 3), 10); r < t.length - 1 ? o.push(+t.slice(r), 7) : r < t.length && o.push(+t[r], 4) }, t => /[0-9]/.test(t), (t, o) => 14 + 2 * (o > 26) + 2 * (o > 9) + 10 * t / 3), u = a(t => (o, e) => { o.push(2, 4), o.push(t.length, 9 + 2 * (e > 26) + 2 * (e > 9)); let r = 0; for (; r < t.length - 1; r += 2)o.push(45 * s(t[r]) + s(t[r + 1]), 11); r < t.length && o.push(s(t[r]), 6) }, t => s(t) >= 0, (t, o) => 13 + 2 * (o > 26) + 2 * (o > 9) + 5.5 * t), d = a(t => l([...t].map(f)), t => f(t) < 128, (t, o) => 12 + 8 * (o > 9) + 8 * t); d._ = !0, d.u = !0; const p = a(d, t => f(t) < 256, d.l, 3); p._ = !0; const m = new TextEncoder, h = a(t => l(m.encode(t)), () => 1, 0, 26, (t, o) => 12 + 8 * (o > 9) + 8 * m.encode(t).length); h._ = !0; let w = () => { const t = new Map, o = new TextDecoder("sjis"), e = r(2); for (let r = 0; r < 7973; ++r)e[0] = r / 192 + 129 + 64 * (r > 5951), e[1] = r % 192 + 64, t.set(o.decode(e), r); return t.delete("\ufffd"), w = () => t, t }; const y = a(t => (o, e) => { o.push(8, 4), o.push(t.length, 8 + 2 * (e > 26) + 2 * (e > 9)); for (const e of t) o.push(w().get(e), 13) }, t => w().has(t), (t, o) => 12 + 2 * (o > 26) + 2 * (o > 9) + 13 * t); y._ = !0; const g = [_, u, d, p, y, h], b = { auto: (t, { modes: o = g } = {}) => (e, r) => { const s = o.map((o, e) => { const n = new Map, s = (t, o) => (n.has(t) || n.set(t, o(t, r)), n.get(t)); return { m: o, h: 1 << e, C: o.est("", r), S: o.l ? (t, e) => s(e - t, o.l) : (e, r) => s(t.slice(e, r), o.est) } }); let f = [{ v: 0 }], c = 0, i = 0, l = -1; for (const o of [...t, ""]) { let t = 0; if (o) for (const e of s) e.m.test(o) && (t |= e.h); if (!o || t !== l) { if (-1 !== l) { const t = new Set(f.map(t => t.D)), o = []; for (const { m: e, C: r, S: n, h: a } of s) if (l & a) { const s = n(c, i); for (const l of e.eci ?? t) if (!e.u || !l) { let t; for (const o of f) if (o.D === l || e.eci) { const f = o.m === e && o.D === l, a = f ? o.V : o, _ = e._ && f ? o.v + s - r : a.v + 12 * (a.D !== l) + (f ? n(f ? o.$ : c, i) : s); (!t || _ < t.v) && (t = { $: f ? o.$ : c, V: a, m: e, D: l, A: i, v: _ }) } t && o.push(t) } } f = o } l = t, c = i } i += o.length } f.length || n(5); const a = []; for (let o = f.reduce((t, o) => o.v < t.v ? o : t); o.m; o = o.V)a.push(o.m(t.slice(o.$, o.A))); a.reverse().forEach(t => t(e, r)) }, multi: c, eci: i, bytes: l, numeric: _, alphaNumeric: u, ascii: d, iso8859_1: p, shift_jis: y, utf8: h }, C = () => ({ F: r(2956), I: 0, push(t, o) { for (let e = o, r = 8 - (7 & this.I); e > 0; e -= r, r = 8)this.F[this.I >> 3] |= t << r >> e, this.I += e < r ? e : r } }), x = (t, o = t * t, e = r(o)) => ({ size: t, K: e, get: (o, r) => o >= 0 && o < t && !!(1 & e[r * t + o]), toString({ on: o = "##", off: e = " ", lf: r = "\n", pad: n = 4, padX: s = n, padY: f = n } = {}) { let c = ""; for (let n = -f; n < t + f; ++n){ for (let r = -s; r < t + s; ++r)c += this.get(r, n) ? o : e; c += r } return c }, toImageData(o, { on: e = [0, 0, 0], off: r = [0, 0, 0, 0], pad: n = 4, padX: s = n, padY: f = n } = {}) { const c = t + 2 * s, i = t + 2 * f, l = o.createImageData(c, i), a = new Uint32Array(l.data.buffer); l.data.set([...e, 255]); const _ = a[0]; l.data.set([...r, 255]); const u = a[0]; for (let t = 0; t < i; ++t)for (let o = 0; o < c; ++o)a[t * c + o] = this.get(o - s, t - f) ? _ : u; return l }, toCanvas(t, o) { const e = t.getContext("2d"), r = this.toImageData(e, o); t.width = r.width, t.height = r.height, e.putImageData(r, 0, 0) }, toDataURL({ type: t = "image/png", scale: o = 1, ...e } = {}) { const r = document.createElement("canvas"), n = r.getContext("2d"), s = this.toImageData(n, e); return r.width = s.width * o, r.height = s.height * o, n.putImageData(s, 0, 0), n.imageSmoothingEnabled = !1, n.globalCompositeOperation = "copy", n.drawImage(r, 0, 0, s.width, s.height, 0, 0, r.width, r.height), r.toDataURL(t, 1) } }), z = [(t, o) => 1 & (t ^ o), (t, o) => 1 & o, t => t % 3, (t, o) => (t + o) % 3, (t, o) => 1 & (t / 3 ^ o >> 1), (t, o) => (t & o & 1) + t * o % 3, (t, o) => (t & o) + t * o % 3 & 1, (t, o) => (t ^ o) + t * o % 3 & 1], E = r(511); for (let t = 0, o = 1; t < 255; o = 2 * o ^ 285 * (o > 127))E[E[o + 255] = t++] = o; const M = t => E[t % 255], S = t => E[t + 255], v = (t, o) => { const e = r(t.length + o.length - 1); for (let r = 0; r < t.length; ++r)for (let n = 0; n < o.length; ++n)e[r + n] ^= M(t[r] + o[n]); return e.map(S) }, D = (t, o) => { const e = r(t.length + o.length - 1); e.set(t, 0); for (let r = 0; r < t.length; ++r)if (e[r]) { const t = S(e[r]); for (let n = 0; n < o.length; ++n)e[r + n] ^= M(o[n] + t) } return e.slice(t.length) }, L = [[0], [0, 0]]; for (let t = 1; t < 30; ++t)L.push(v(L[t], [0, t])); const V = (t, o) => { const e = [[], []]; let n = 0, s = 0; for (const [r, f] of o.o) for (let c = 0; c < r; ++c, n += f){ const r = t.slice(n, n + f); e[0].push(r), e[1].push(D(r, L[o.i])), s += f + o.i } const f = r(s); s = 0; for (const t of e) for (let o, e = 0; s !== o; ++e){ o = s; for (const o of t) e < o.length && (f[s++] = o[e]) } return f }, $ = (t, o, e) => { let r = t <<= e; for (let t = 134217728; t >>= 1;)r & t && (r ^= o * (t >> e)); return r | t }, A = ({ size: t, K: o }, e) => { const r = (e, r, n, s) => { for (; n-- > 0; e += t)o.fill(s, e, e + r) }, n = (o, e, n) => { for (let s = 0; s++ < 3; n -= 2)r(e * t + o - (n >> 1) * (t + 1), n, n, 2 | s) }, s = 2 * ((t - 13) / (1 + (e / 7 | 0)) / 2 + .75 | 0); if (e > 1) for (let o = t - 7; o > 8; o -= s){ for (let t = o; t > 8; t -= s)n(o, t, 5); o < t - 7 && n(o, 6, 5) } if (e > 6) for (let r = $(e, 7973, 12), n = 1; n < 7; ++n)for (let e = 12; e-- > 9; r >>= 1)o[n * t - e] = 2 | 1 & r; r(7, 2, 9, 2), r(t - 8, 8, 9, 2); for (let e = 0; e < t; ++e)o[6 * t + e] = 3 ^ 1 & e; n(3, 3, 7), n(t - 4, 3, 7); for (let e = 0; e < t; ++e)for (let r = e; r < t; ++r)o[r * t + e] = o[e * t + r]; o[(t - 8) * t + 8] = 3 }, F = ({ size: t, K: o }) => { const e = []; for (let r = t - 2, n = t, s = -1; r >= 0; r -= 2){ for (5 === r && (r = 4); n += s, -1 !== n && n !== t;){ const s = n * t + r; o[s + 1] || e.push(s + 1), o[s] || e.push(s) } s *= -1 } return e }, H = ({ K: t }, o, e) => o.forEach((o, r) => t[o] = e[r >> 3] >> (7 & ~r) & 1), I = ({ size: t, K: o }, e, r, n) => { for (let r = 0; r < t; ++r)for (let n = 0; n < t; ++n){ const s = r * t + n; o[s] ^= !(e(n, r) || 2 & o[s]) } let s = 21522 ^ $((1 ^ n) << 3 | r, 1335, 10); for (let e = 0; e++ < 8; s >>= 1)o[(e - (e < 7)) * t + 8] = 1 & s, o[9 * t - e] = 1 & s; for (let e = 8; --e, s; s >>= 1)o[8 * t + e - (e < 7)] = 1 & s, o[(t - e) * t + 8] = 1 & s }, K = ({ size: t, K: o }, e = 0, r = 0) => { for (let n = 0; n < t; ++n){ for (let s = 0; s < 2; ++s)for (let f, c = 0, i = 0, l = 0; c < t; ++c){ const a = 1 & o[s ? n * t + c : c * t + n]; r += a, i = (i >> 1 | 2098176) & (3047517 ^ a - 1), 2049 & i && (e += 40), a !== f && (l = 0), f = a, e += 5 === ++l ? 3 : l > 5 } if (n) for (let r = t + n, s = 5 * o[n - 1] ^ o[n]; r < t * t; r += t){ const t = 5 * o[r - 1] ^ o[r]; e += 3 * !(1 & (s | t) | 4 & (s ^ t)), s = t } } return e + 10 * (10 * Math.abs(r / (t * t) - 1) | 0) }, N = [], P = (t = n(1), { minCorrectionLevel: e = 0, maxCorrectionLevel: r = 3, minVersion: s = 1, maxVersion: f = 40, mask: c, trailer: i = 60433, ...l } = {}) => { r < e && n(3), f < s && n(2), "string" == typeof t && (t = b.auto(t, l)); for (let n = s, l = 0; n <= f; ++n){ let s = N[n]; s || (N[n] = s = x(4 * n + 17), A(s, n), s.p = F(s)); const f = o(n, s.p.length >> 3); if (8 * f(e).t < l) continue; const a = C(); t(a, n), l = a.I; for (let t = r; t >= e; --t){ const o = f(t); if (8 * o.t < l) continue; for (a.I = l + 11 & -8; a.I < 8 * o.t;)a.push(i, 16); const e = x(s.size, s.K); return H(e, s.p, V(a.F, o)), (z[c ?? -1] ? [z[c]] : z).map((o, r) => { const n = x(e.size, e.K); return I(n, o, c ?? r, t), n.s = K(n), n }).reduce((t, o) => o.s < t.s ? o : t) } } n(4) }; P.with = (...t) => (o, e) => P(o, { modes: [...g, ...t], ...e }); export { e as correction, P as generate, b as mode }; diff --git a/website_bkp/scripts/modules/lightweight-charts/.gitignore b/website_bkp/scripts/modules/lightweight-charts/.gitignore new file mode 100644 index 000000000..b604584b3 --- /dev/null +++ b/website_bkp/scripts/modules/lightweight-charts/.gitignore @@ -0,0 +1,2 @@ +*charts.pro* +light*.js diff --git a/website_bkp/scripts/modules/lightweight-charts/5.2.0/dist/lightweight-charts.standalone.production.mjs b/website_bkp/scripts/modules/lightweight-charts/5.2.0/dist/lightweight-charts.standalone.production.mjs new file mode 100644 index 000000000..55d653306 --- /dev/null +++ b/website_bkp/scripts/modules/lightweight-charts/5.2.0/dist/lightweight-charts.standalone.production.mjs @@ -0,0 +1,8 @@ +// @ts-nocheck +/*! + * @license + * TradingView Lightweight Charts™ v5.2.0 + * Copyright (c) 2026 TradingView, Inc. + * Licensed under Apache License 2.0 https://www.apache.org/licenses/LICENSE-2.0 + */ +const t={title:"",visible:!0,hitTestTolerance:3,lastValueVisible:!0,priceLineVisible:!0,priceLineSource:0,priceLineWidth:1,priceLineColor:"",priceLineStyle:2,baseLineVisible:!0,baseLineWidth:1,baseLineColor:"#B2B5BE",baseLineStyle:0,priceFormat:{type:"price",precision:2,minMove:.01}};var i,n;function s(t,i){const n=function(t,i){switch(t){case 0:default:return[];case 1:return[i,i];case 2:return[2*i,2*i];case 3:return[6*i,6*i];case 4:return[i,4*i]}}(i,t.lineWidth);return t.setLineDash(n),n}function e(t,i,n,s){t.beginPath();const e=t.lineWidth%2?.5:0;t.moveTo(n,i+e),t.lineTo(s,i+e),t.stroke()}function r(t,i){if(!t)throw new Error("Assertion failed"+(i?": "+i:""))}function h(t){if(void 0===t)throw new Error("Value is undefined");return t}function a(t){if(null===t)throw new Error("Value is null");return t}function l(t){return a(h(t))}!function(t){t[t.Simple=0]="Simple",t[t.WithSteps=1]="WithSteps",t[t.Curved=2]="Curved"}(i||(i={})),function(t){t[t.Solid=0]="Solid",t[t.Dotted=1]="Dotted",t[t.Dashed=2]="Dashed",t[t.LargeDashed=3]="LargeDashed",t[t.SparseDotted=4]="SparseDotted"}(n||(n={}));class o{constructor(){this.t=[]}i(t,i,n){const s={h:t,l:i,o:!0===n};this.t.push(s)}_(t){const i=this.t.findIndex((i=>t===i.h));i>-1&&this.t.splice(i,1)}u(t){this.t=this.t.filter((i=>i.l!==t))}p(t,i,n){const s=[...this.t];this.t=this.t.filter((t=>!t.o)),s.forEach((s=>s.h(t,i,n)))}v(){return this.t.length>0}m(){this.t=[]}}function _(t,...i){for(const n of i)for(const i in n)void 0!==n[i]&&Object.prototype.hasOwnProperty.call(n,i)&&!["__proto__","constructor","prototype"].includes(i)&&("object"!=typeof n[i]||void 0===t[i]||Array.isArray(n[i])?t[i]=n[i]:_(t[i],n[i]));return t}function u(t){return"number"==typeof t&&isFinite(t)}function c(t){return"number"==typeof t&&t%1==0}function d(t){return"string"==typeof t}function f(t){return"boolean"==typeof t}function p(t){const i=t;if(!i||"object"!=typeof i)return i;let n,s,e;for(s in n=Array.isArray(i)?[]:{},i)i.hasOwnProperty(s)&&(e=i[s],n[s]=e&&"object"==typeof e?p(e):e);return n}function v(t){return null!==t}function m(t){return null===t?void 0:t}const w="-apple-system, BlinkMacSystemFont, 'Trebuchet MS', Roboto, Ubuntu, sans-serif";function g(t,i,n){return void 0===i&&(i=w),`${n=void 0!==n?`${n} `:""}${t}px ${i}`}class M{constructor(t){this.M={S:1,C:5,P:NaN,k:"",T:"",R:"",D:"",I:0,V:0,B:0,A:0,O:0},this.L=t}N(){const t=this.M,i=this.F(),n=this.W();return t.P===i&&t.T===n||(t.P=i,t.T=n,t.k=g(i,n),t.A=2.5/12*i,t.I=t.A,t.V=i/12*t.C,t.B=i/12*t.C,t.O=0),t.R=this.H(),t.D=this.U(),this.M}H(){return this.L.N().layout.textColor}U(){return this.L.$()}F(){return this.L.N().layout.fontSize}W(){return this.L.N().layout.fontFamily}}function b(t){return t<0?0:t>255?255:Math.round(t)||0}function x(t){return.199*t[0]+.687*t[1]+.114*t[2]}class S{constructor(t,i){this.j=new Map,this.q=t,i&&(this.j=i)}Y(t,i){if("transparent"===t)return t;const n=this.K(t),s=n[3];return`rgba(${n[0]}, ${n[1]}, ${n[2]}, ${i*s})`}Z(t){const i=this.K(t);return{G:`rgb(${i[0]}, ${i[1]}, ${i[2]})`,X:x(i)>160?"black":"white"}}J(t){return x(this.K(t))}tt(t,i,n){const[s,e,r,h]=this.K(t),[a,l,o,_]=this.K(i),u=[b(s+n*(a-s)),b(e+n*(l-e)),b(r+n*(o-r)),(c=h+n*(_-h),c<=0||c>1?Math.min(Math.max(c,0),1):Math.round(1e4*c)/1e4)];var c;return`rgba(${u[0]}, ${u[1]}, ${u[2]}, ${u[3]})`}K(t){const i=this.j.get(t);if(i)return i;const n=function(t){const i=document.createElement("div");i.style.display="none",document.body.appendChild(i),i.style.color=t;const n=window.getComputedStyle(i).color;return document.body.removeChild(i),n}(t),s=n.match(/^rgba?\s*\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d*\.?\d+))?\)$/);if(!s){if(this.q.length)for(const i of this.q){const n=i(t);if(n)return this.j.set(t,n),n}throw new Error(`Failed to parse color: ${t}`)}const e=[parseInt(s[1],10),parseInt(s[2],10),parseInt(s[3],10),s[4]?parseFloat(s[4]):1];return this.j.set(t,e),e}}class C{constructor(){this.it=[]}nt(t){this.it=t}st(t,i,n){this.it.forEach((s=>{s.st(t,i,n)}))}}class y{st(t,i,n){t.useBitmapCoordinateSpace((t=>this.et(t,i,n)))}}class P extends y{constructor(){super(...arguments),this.rt=null}ht(t){this.rt=t}et({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){if(null===this.rt||null===this.rt.lt)return;const s=this.rt.lt,e=this.rt,r=Math.max(1,Math.floor(i))%2/2,h=h=>{t.beginPath();for(let a=s.to-1;a>=s.from;--a){const s=e.ot[a],l=Math.round(s._t*i)+r,o=s.ut*n,_=h*n+r;t.moveTo(l,o),t.arc(l,o,_,0,2*Math.PI)}t.fill()};e.ct>0&&(t.fillStyle=e.dt,h(e.ft+e.ct)),t.fillStyle=e.vt,h(e.ft)}}function k(){return{ot:[{_t:0,ut:0,wt:0,gt:0}],vt:"",dt:"",ft:0,ct:0,lt:null}}const T={from:0,to:1};class R{constructor(t,i,n){this.Mt=new C,this.bt=[],this.xt=[],this.St=!0,this.L=t,this.Ct=i,this.yt=n,this.Mt.nt(this.bt)}Pt(t){this.kt(),this.St=!0}Tt(){return this.St&&(this.Rt(),this.St=!1),this.Mt}kt(){const t=this.yt.Dt();t.length!==this.bt.length&&(this.xt=t.map(k),this.bt=this.xt.map((t=>{const i=new P;return i.ht(t),i})),this.Mt.nt(this.bt))}Rt(){const t=2===this.Ct.N().mode||!this.Ct.It(),i=this.yt.Vt(),n=this.Ct.Et(),s=this.L.Bt();this.kt(),i.forEach(((i,e)=>{const r=this.xt[e],h=i.At(n),a=i.zt();!t&&null!==h&&i.It()&&null!==a?(r.vt=h.Ot,r.ft=h.ft,r.ct=h.Lt,r.ot[0].gt=h.gt,r.ot[0].ut=i.Ft().Nt(h.gt,a.Wt),r.dt=h.Ht??this.L.Ut(r.ot[0].ut/i.Ft().$t()),r.ot[0].wt=n,r.ot[0]._t=s.jt(n),r.lt=T):r.lt=null}))}}class D extends y{constructor(t){super(),this.qt=t}et({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:r}){if(null===this.qt)return;const h=this.qt.Yt.It,a=this.qt.Kt.It;if(!h&&!a)return;const l=Math.round(this.qt._t*n),o=Math.round(this.qt.ut*r);t.lineCap="butt",h&&l>=0&&(t.lineWidth=Math.floor(this.qt.Yt.ct*n),t.strokeStyle=this.qt.Yt.R,t.fillStyle=this.qt.Yt.R,s(t,this.qt.Yt.Zt),function(t,i,n,s){t.beginPath();const e=t.lineWidth%2?.5:0;t.moveTo(i+e,n),t.lineTo(i+e,s),t.stroke()}(t,l,0,i.height)),a&&o>=0&&(t.lineWidth=Math.floor(this.qt.Kt.ct*r),t.strokeStyle=this.qt.Kt.R,t.fillStyle=this.qt.Kt.R,s(t,this.qt.Kt.Zt),e(t,o,0,i.width))}}class I{constructor(t,i){this.St=!0,this.Gt={Yt:{ct:1,Zt:0,R:"",It:!1},Kt:{ct:1,Zt:0,R:"",It:!1},_t:0,ut:0},this.Xt=new D(this.Gt),this.Jt=t,this.yt=i}Pt(){this.St=!0}Tt(t){return this.St&&(this.Rt(),this.St=!1),this.Xt}Rt(){const t=this.Jt.It(),i=this.yt.Qt().N().crosshair,n=this.Gt;if(2===i.mode)return n.Kt.It=!1,void(n.Yt.It=!1);n.Kt.It=t&&this.Jt.ti(this.yt),n.Yt.It=t&&this.Jt.ii(),n.Kt.ct=i.horzLine.width,n.Kt.Zt=i.horzLine.style,n.Kt.R=i.horzLine.color,n.Yt.ct=i.vertLine.width,n.Yt.Zt=i.vertLine.style,n.Yt.R=i.vertLine.color,n._t=this.Jt.ni(),n.ut=this.Jt.si()}}function V(t,i,n,s,e,r){t.fillRect(i+r,n,s-2*r,r),t.fillRect(i+r,n+e-r,s-2*r,r),t.fillRect(i,n,r,e),t.fillRect(i+s-r,n,r,e)}function E(t,i,n,s,e,r){t.save(),t.globalCompositeOperation="copy",t.fillStyle=r,t.fillRect(i,n,s,e),t.restore()}function B(t,i,n,s,e,r){t.beginPath(),t.roundRect?t.roundRect(i,n,s,e,r):(t.lineTo(i+s-r[1],n),0!==r[1]&&t.arcTo(i+s,n,i+s,n+r[1],r[1]),t.lineTo(i+s,n+e-r[2]),0!==r[2]&&t.arcTo(i+s,n+e,i+s-r[2],n+e,r[2]),t.lineTo(i+r[3],n+e),0!==r[3]&&t.arcTo(i,n+e,i,n+e-r[3],r[3]),t.lineTo(i,n+r[0]),0!==r[0]&&t.arcTo(i,n,i+r[0],n,r[0]))}function A(t,i,n,s,e,r,h=0,a=[0,0,0,0],l=""){if(t.save(),!h||!l||l===r)return B(t,i,n,s,e,a),t.fillStyle=r,t.fill(),void t.restore();const o=h/2;var _;B(t,i+o,n+o,s-h,e-h,(_=-o,a.map((t=>0===t?t:t+_)))),"transparent"!==r&&(t.fillStyle=r,t.fill()),"transparent"!==l&&(t.lineWidth=h,t.strokeStyle=l,t.closePath(),t.stroke()),t.restore()}function z(t,i,n,s,e,r,h){t.save(),t.globalCompositeOperation="copy";const a=t.createLinearGradient(0,0,0,e);a.addColorStop(0,r),a.addColorStop(1,h),t.fillStyle=a,t.fillRect(i,n,s,e),t.restore()}class O{constructor(t,i){this.ht(t,i)}ht(t,i){this.qt=t,this.ei=i}$t(t,i){return this.qt.It?t.P+t.A+t.I:0}st(t,i,n,s){if(!this.qt.It||0===this.qt.ri.length)return;const e=this.qt.R,r=this.ei.G,h=t.useBitmapCoordinateSpace((t=>{const h=t.context;h.font=i.k;const a=this.hi(t,i,n,s),l=a.ai;return a.li?A(h,l.oi,l._i,l.ui,l.ci,r,l.di,[l.ft,0,0,l.ft],r):A(h,l.fi,l._i,l.ui,l.ci,r,l.di,[0,l.ft,l.ft,0],r),this.qt.pi&&(h.fillStyle=e,h.fillRect(l.fi,l.mi,l.wi-l.fi,l.gi)),this.qt.Mi&&(h.fillStyle=i.D,h.fillRect(a.li?l.bi-l.di:0,l._i,l.di,l.xi-l._i)),a}));t.useMediaCoordinateSpace((({context:t})=>{const n=h.Si;t.font=i.k,t.textAlign=h.li?"right":"left",t.textBaseline="middle",t.fillStyle=e,t.fillText(this.qt.ri,n.Ci,(n._i+n.xi)/2+n.yi)}))}hi(t,i,n,s){const{context:e,bitmapSize:r,mediaSize:h,horizontalPixelRatio:a,verticalPixelRatio:l}=t,o=this.qt.pi||!this.qt.Pi?i.C:0,_=this.qt.ki?i.S:0,u=i.A+this.ei.Ti,c=i.I+this.ei.Ri,d=i.V,f=i.B,p=this.qt.ri,v=i.P,m=n.Di(e,p),w=Math.ceil(n.Ii(e,p)),g=v+u+c,M=i.S+d+f+w+o,b=Math.max(1,Math.floor(l));let x=Math.round(g*l);x%2!=b%2&&(x+=1);const S=_>0?Math.max(1,Math.floor(_*a)):0,C=Math.round(M*a),y=Math.round(o*a),P=this.ei.Vi??this.ei.Ei??this.ei.Bi,k=Math.round(P*l)-Math.floor(.5*l),T=Math.floor(k+b/2-x/2),R=T+x,D="right"===s,I=D?h.width-_:_,V=D?r.width-S:S;let E,B,A;return D?(E=V-C,B=V-y,A=I-o-d-_):(E=V+C,B=V+y,A=I+o+d),{li:D,ai:{_i:T,mi:k,xi:R,ui:C,ci:x,ft:2*a,di:S,oi:E,fi:V,wi:B,gi:b,bi:r.width},Si:{_i:T/l,xi:R/l,Ci:A,yi:m}}}}class L{constructor(t){this.Ai={Bi:0,G:"#000",Ri:0,Ti:0},this.zi={ri:"",It:!1,pi:!0,Pi:!1,Ht:"",R:"#FFF",Mi:!1,ki:!1},this.Oi={ri:"",It:!1,pi:!1,Pi:!0,Ht:"",R:"#FFF",Mi:!0,ki:!0},this.St=!0,this.Li=new(t||O)(this.zi,this.Ai),this.Ni=new(t||O)(this.Oi,this.Ai)}ri(){return this.Fi(),this.zi.ri}Bi(){return this.Fi(),this.Ai.Bi}Pt(){this.St=!0}$t(t,i=!1){return Math.max(this.Li.$t(t,i),this.Ni.$t(t,i))}Wi(){return this.Ai.Vi??null}Hi(){return this.Ai.Vi??this.Ai.Ei??this.Bi()}Ui(t){this.Ai.Ei=t??void 0}$i(){return this.Fi(),this.zi.It||this.Oi.It}ji(){return this.Fi(),this.zi.It}Tt(t){return this.Fi(),this.zi.pi=this.zi.pi&&t.N().ticksVisible,this.Oi.pi=this.Oi.pi&&t.N().ticksVisible,this.Li.ht(this.zi,this.Ai),this.Ni.ht(this.Oi,this.Ai),this.Li}qi(){return this.Fi(),this.Li.ht(this.zi,this.Ai),this.Ni.ht(this.Oi,this.Ai),this.Ni}Fi(){this.St&&(this.zi.pi=!0,this.Oi.pi=!1,this.Yi(this.zi,this.Oi,this.Ai))}}class N extends L{constructor(t,i,n){super(),this.Jt=t,this.Ki=i,this.Zi=n}Yi(t,i,n){if(t.It=!1,2===this.Jt.N().mode)return;const s=this.Jt.N().horzLine;if(!s.labelVisible)return;const e=this.Ki.zt();if(!this.Jt.It()||this.Ki.Gi()||null===e)return;const r=this.Ki.Xi().Z(s.labelBackgroundColor);n.G=r.G,t.R=r.X;const h=2/12*this.Ki.P();n.Ti=h,n.Ri=h;const a=this.Zi(this.Ki);n.Bi=a.Bi,t.ri=this.Ki.Ji(a.gt,e),t.It=!0}}const F=/[1-9]/g;class W{constructor(){this.qt=null}ht(t){this.qt=t}st(t,i){if(null===this.qt||!1===this.qt.It||0===this.qt.ri.length)return;const n=t.useMediaCoordinateSpace((({context:t})=>(t.font=i.k,Math.round(i.Qi.Ii(t,a(this.qt).ri,F)))));if(n<=0)return;const s=i.tn,e=n+2*s,r=e/2,h=this.qt.nn;let l=this.qt.Bi,o=Math.floor(l-r)+.5;o<0?(l+=Math.abs(0-o),o=Math.floor(l-r)+.5):o+e>h&&(l-=Math.abs(h-(o+e)),o=Math.floor(l-r)+.5);const _=o+e,u=Math.ceil(0+i.S+i.C+i.A+i.P+i.I);t.useBitmapCoordinateSpace((({context:t,horizontalPixelRatio:n,verticalPixelRatio:s})=>{const e=a(this.qt);t.fillStyle=e.G;const r=Math.round(o*n),h=Math.round(0*s),l=Math.round(_*n),c=Math.round(u*s),d=Math.round(2*n);if(t.beginPath(),t.moveTo(r,h),t.lineTo(r,c-d),t.arcTo(r,c,r+d,c,d),t.lineTo(l-d,c),t.arcTo(l,c,l,c-d,d),t.lineTo(l,h),t.fill(),e.pi){const r=Math.round(e.Bi*n),a=h,l=Math.round((a+i.C)*s);t.fillStyle=e.R;const o=Math.max(1,Math.floor(n)),_=Math.floor(.5*n);t.fillRect(r-_,a,o,l-a)}})),t.useMediaCoordinateSpace((({context:t})=>{const n=a(this.qt),e=0+i.S+i.C+i.A+i.P/2;t.font=i.k,t.textAlign="left",t.textBaseline="middle",t.fillStyle=n.R;const r=i.Qi.Di(t,"Apr0");t.translate(o+s,e+r),t.fillText(n.ri,0,0)}))}}class H{constructor(t,i,n){this.St=!0,this.Xt=new W,this.Gt={It:!1,G:"#4c525e",R:"white",ri:"",nn:0,Bi:NaN,pi:!0},this.Ct=t,this.sn=i,this.Zi=n}Pt(){this.St=!0}Tt(){return this.St&&(this.Rt(),this.St=!1),this.Xt.ht(this.Gt),this.Xt}Rt(){const t=this.Gt;if(t.It=!1,2===this.Ct.N().mode)return;const i=this.Ct.N().vertLine;if(!i.labelVisible)return;const n=this.sn.Bt();if(n.Gi())return;t.nn=n.nn();const s=this.Zi();if(null===s)return;t.Bi=s.Bi;const e=n.en(this.Ct.Et());t.ri=n.rn(a(e)),t.It=!0;const r=this.sn.Xi().Z(i.labelBackgroundColor);t.G=r.G,t.R=r.X,t.pi=n.N().ticksVisible}}class U{constructor(){this.hn=null,this.an=0}ln(){return this.an}_n(t){this.an=t}Ft(){return this.hn}un(t){this.hn=t}cn(t){return[]}dn(){return[]}It(){return!0}}var $;!function(t){t[t.Normal=0]="Normal",t[t.Magnet=1]="Magnet",t[t.Hidden=2]="Hidden",t[t.MagnetOHLC=3]="MagnetOHLC"}($||($={}));class j extends U{constructor(t,i){super(),this.yt=null,this.fn=NaN,this.pn=0,this.vn=!1,this.mn=new Map,this.wn=!1,this.gn=new WeakMap,this.Mn=new WeakMap,this.bn=NaN,this.xn=NaN,this.Sn=NaN,this.Cn=NaN,this.sn=t,this.yn=i;this.Pn=((t,i)=>n=>{const s=i(),e=t();if(n===a(this.yt).kn())return{gt:e,Bi:s};{const t=a(n.zt());return{gt:n.Tn(s,t),Bi:s}}})((()=>this.fn),(()=>this.xn));const n=((t,i)=>()=>{const n=this.sn.Bt().Rn(t()),s=i();return n&&Number.isFinite(s)?{wt:n,Bi:s}:null})((()=>this.pn),(()=>this.ni()));this.Dn=new H(this,t,n)}N(){return this.yn}In(t,i){this.Sn=t,this.Cn=i}Vn(){this.Sn=NaN,this.Cn=NaN}En(){return this.Sn}Bn(){return this.Cn}An(t,i,n){this.wn||(this.wn=!0),this.vn=!0,this.zn(t,i,n)}Et(){return this.pn}ni(){return this.bn}si(){return this.xn}It(){return this.vn}On(){this.vn=!1,this.Ln(),this.fn=NaN,this.bn=NaN,this.xn=NaN,this.yt=null,this.Vn(),this.Nn()}Fn(t){if(!this.yn.doNotSnapToHiddenSeriesIndices)return t;const i=this.sn,n=i.Bt();let s=null,e=null;for(const n of i.Wn()){const i=n.Un().Hn(t,-1);if(i){if(i.$n===t)return t;(null===s||i.$n>s)&&(s=i.$n)}const r=n.Un().Hn(t,1);if(r){if(r.$n===t)return t;(null===e||r.$nMath.abs(h-n.jt(t))));return r[a.indexOf(Math.min(...a))]}jn(t){let i=this.gn.get(t);i||(i=new I(this,t),this.gn.set(t,i));let n=this.Mn.get(t);return n||(n=new R(this.sn,this,t),this.Mn.set(t,n)),[i,n]}ti(t){return t===this.yt&&this.yn.horzLine.visible}ii(){return this.yn.vertLine.visible}qn(t,i){this.vn&&this.yt===t||this.mn.clear();const n=[];return this.yt===t&&n.push(this.Yn(this.mn,i,this.Pn)),n}dn(){return this.vn?[this.Dn]:[]}Kn(){return this.yt}Nn(){this.sn.Zn().forEach((t=>{this.gn.get(t)?.Pt(),this.Mn.get(t)?.Pt()})),this.mn.forEach((t=>t.Pt())),this.Dn.Pt()}Gn(t){return t&&!t.kn().Gi()?t.kn():null}zn(t,i,n){this.Xn(t,i,n)&&this.Nn()}Xn(t,i,n){const s=this.bn,e=this.xn,r=this.fn,h=this.pn,a=this.yt,l=this.Gn(n);this.pn=t,this.bn=isNaN(t)?NaN:this.sn.Bt().jt(t),this.yt=n;const o=null!==l?l.zt():null;return null!==l&&null!==o?(this.fn=i,this.xn=l.Nt(i,o)):(this.fn=NaN,this.xn=NaN),s!==this.bn||e!==this.xn||h!==this.pn||r!==this.fn||a!==this.yt}Ln(){const t=this.sn.Jn().map((t=>t.Un().Qn())).filter(v),i=0===t.length?null:Math.max(...t);this.pn=null!==i?i:NaN}Yn(t,i,n){let s=t.get(i);return void 0===s&&(s=new N(this,i,n),t.set(i,s)),s}}function q(t){return"left"===t||"right"===t}class Y{constructor(t){this.ts=new Map,this.ns=[],this.ss=t}es(t,i){const n=function(t,i){return void 0===t?i:{rs:Math.max(t.rs,i.rs),hs:t.hs||i.hs}}(this.ts.get(t),i);this.ts.set(t,n)}ls(){return this.ss}_s(t){const i=this.ts.get(t);return void 0===i?{rs:this.ss}:{rs:Math.max(this.ss,i.rs),hs:i.hs}}us(){this.cs(),this.ns=[{ds:0}]}fs(t){this.cs(),this.ns=[{ds:1,Wt:t}]}ps(t){this.vs(),this.ns.push({ds:5,Wt:t})}cs(){this.vs(),this.ns.push({ds:6})}ws(){this.cs(),this.ns=[{ds:4}]}gs(t){this.cs(),this.ns.push({ds:2,Wt:t})}Ms(t){this.cs(),this.ns.push({ds:3,Wt:t})}bs(){return this.ns}xs(t){for(const i of t.ns)this.Ss(i);this.ss=Math.max(this.ss,t.ss),t.ts.forEach(((t,i)=>{this.es(i,t)}))}static Cs(){return new Y(2)}static ys(){return new Y(3)}Ss(t){switch(t.ds){case 0:this.us();break;case 1:this.fs(t.Wt);break;case 2:this.gs(t.Wt);break;case 3:this.Ms(t.Wt);break;case 4:this.ws();break;case 5:this.ps(t.Wt);break;case 6:this.vs()}}vs(){const t=this.ns.findIndex((t=>5===t.ds));-1!==t&&this.ns.splice(t,1)}}class K{formatTickmarks(t){return t.map((t=>this.format(t)))}}const Z=".";function G(t,i){if(!u(t))return"n/a";if(!c(i))throw new TypeError("invalid length");if(i<0||i>16)throw new TypeError("invalid length");if(0===i)return t.toString();return("0000000000000000"+t.toString()).slice(-i)}class X extends K{constructor(t,i){if(super(),i||(i=1),u(t)&&c(t)||(t=100),t<0)throw new TypeError("invalid base");this.Ki=t,this.Ps=i,this.ks()}format(t){const i=t<0?"−":"";return t=Math.abs(t),i+this.Ts(t)}ks(){if(this.Rs=0,this.Ki>0&&this.Ps>0){let t=this.Ki;for(;t>1;)t/=10,this.Rs++}}Ts(t){const i=this.Ki/this.Ps;let n=Math.floor(t),s="";const e=void 0!==this.Rs?this.Rs:NaN;if(i>1){let r=+(Math.round(t*i)-n*i).toFixed(this.Rs);r>=i&&(r-=i,n+=1),s=Z+G(+r.toFixed(this.Rs)*this.Ps,e)}else n=Math.round(n*i)/i,e>0&&(s=Z+G(0,e));return n.toFixed(0)+s}}class J extends X{constructor(t=100){super(t)}format(t){return`${super.format(t)}%`}}class Q extends K{constructor(t){super(),this.Ds=t}format(t){let i="";return t<0&&(i="-",t=-t),t<995?i+this.Is(t):t<999995?i+this.Is(t/1e3)+"K":t<999999995?(t=1e3*Math.round(t/1e3),i+this.Is(t/1e6)+"M"):(t=1e6*Math.round(t/1e6),i+this.Is(t/1e9)+"B")}Is(t){let i;const n=Math.pow(10,this.Ds);return i=(t=Math.round(t*n)/n)>=1e-15&&t<1?t.toFixed(this.Ds).replace(/\.?0+$/,""):String(t),i.replace(/(\.[1-9]*)0+$/,((t,i)=>i))}}const tt=/[2-9]/g;class it{constructor(t=50){this.Vs=0,this.Es=1,this.Bs=1,this.As={},this.zs=new Map,this.Os=t}Ls(){this.Vs=0,this.zs.clear(),this.Es=1,this.Bs=1,this.As={}}Ii(t,i,n){return this.Ns(t,i,n).width}Di(t,i,n){const s=this.Ns(t,i,n);return((s.actualBoundingBoxAscent||0)-(s.actualBoundingBoxDescent||0))/2}Ns(t,i,n){const s=n||tt,e=String(i).replace(s,"0");if(this.zs.has(e))return h(this.zs.get(e)).Fs;if(this.Vs===this.Os){const t=this.As[this.Bs];delete this.As[this.Bs],this.zs.delete(t),this.Bs++,this.Vs--}t.save(),t.textBaseline="middle";const r=t.measureText(e);return t.restore(),0===r.width&&i.length||(this.zs.set(e,{Fs:r,Ws:this.Es}),this.As[this.Es]=e,this.Vs++,this.Es++),r}}class nt{constructor(t){this.Hs=null,this.M=null,this.Us="right",this.$s=t}js(t,i,n){this.Hs=t,this.M=i,this.Us=n}st(t){null!==this.M&&null!==this.Hs&&this.Hs.st(t,this.M,this.$s,this.Us)}}class st{constructor(t,i,n){this.qs=t,this.$s=new it(50),this.Ys=i,this.L=n,this.F=-1,this.Xt=new nt(this.$s)}Tt(){const t=this.L.Ks(this.Ys);if(null===t)return null;const i=t.Zs(this.Ys)?t.Gs():this.Ys.Ft();if(null===i)return null;const n=t.Xs(i);if("overlay"===n)return null;const s=this.L.Js();return s.P!==this.F&&(this.F=s.P,this.$s.Ls()),this.Xt.js(this.qs.qi(),s,n),this.Xt}}class et extends y{constructor(){super(...arguments),this.qt=null}ht(t){this.qt=t}Qs(t,i){if(!this.qt?.It)return null;const{ut:n,ct:s,te:e}=this.qt;return i>=n-s-7&&i<=n+s+7?{ie:this.qt,ne:Math.abs(i-n),se:2,ee:"price-line",te:e}:null}et({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:r}){if(null===this.qt)return;if(!1===this.qt.It)return;const h=Math.round(this.qt.ut*r);h<0||h>i.height||(t.lineCap="butt",t.strokeStyle=this.qt.R,t.lineWidth=Math.floor(this.qt.ct*n),s(t,this.qt.Zt),e(t,h,0,i.width))}}class rt{constructor(t){this.re={ut:0,R:"rgba(0, 0, 0, 0)",ct:1,Zt:0,It:!1},this.he=new et,this.St=!0,this.ae=t,this.le=t.Qt(),this.he.ht(this.re)}Pt(){this.St=!0}Tt(){return this.ae.It()?(this.St&&(this.oe(),this.St=!1),this.he):null}}class ht extends rt{constructor(t){super(t)}oe(){this.re.It=!1;const t=this.ae.Ft(),i=t._e()._e;if(2!==i&&3!==i)return;const n=this.ae.N();if(!n.baseLineVisible||!this.ae.It())return;const s=this.ae.zt();null!==s&&(this.re.It=!0,this.re.ut=t.Nt(s.Wt,s.Wt),this.re.R=n.baseLineColor,this.re.ct=n.baseLineWidth,this.re.Zt=n.baseLineStyle)}}class at extends y{constructor(){super(...arguments),this.qt=null}ht(t){this.qt=t}ue(){return this.qt}et({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){const s=this.qt;if(null===s)return;const e=Math.max(1,Math.floor(i)),r=e%2/2,h=Math.round(s.ce.x*i)+r,a=s.ce.y*n;t.fillStyle=s.de,t.beginPath();const l=Math.max(2,1.5*s.fe)*i;t.arc(h,a,l,0,2*Math.PI,!1),t.fill(),t.fillStyle=s.pe,t.beginPath(),t.arc(h,a,s.ft*i,0,2*Math.PI,!1),t.fill(),t.lineWidth=e,t.strokeStyle=s.ve,t.beginPath(),t.arc(h,a,s.ft*i+e/2,0,2*Math.PI,!1),t.stroke()}}const lt=[{me:0,we:.25,ge:4,Me:10,be:.25,xe:0,Se:.4,Ce:.8},{me:.25,we:.525,ge:10,Me:14,be:0,xe:0,Se:.8,Ce:0},{me:.525,we:1,ge:14,Me:14,be:0,xe:0,Se:0,Ce:0}];class ot{constructor(t){this.Xt=new at,this.St=!0,this.ye=!0,this.Pe=performance.now(),this.ke=this.Pe-1,this.Te=t}Re(){this.ke=this.Pe-1,this.Pt()}De(){if(this.Pt(),2===this.Te.N().lastPriceAnimation){const t=performance.now(),i=this.ke-t;if(i>0)return void(i<650&&(this.ke+=2600));this.Pe=t,this.ke=t+2600}}Pt(){this.St=!0}Ie(){this.ye=!0}It(){return 0!==this.Te.N().lastPriceAnimation}Ve(){switch(this.Te.N().lastPriceAnimation){case 0:return!1;case 1:return!0;case 2:return performance.now()<=this.ke}}Tt(){return this.St?(this.Rt(),this.St=!1,this.ye=!1):this.ye&&(this.Ee(),this.ye=!1),this.Xt}Rt(){this.Xt.ht(null);const t=this.Te.Qt().Bt(),i=t.Be(),n=this.Te.zt();if(null===i||null===n)return;const s=this.Te.Ae(!0);if(s.ze||!i.Oe(s.$n))return;const e={x:t.jt(s.$n),y:this.Te.Ft().Nt(s.gt,n.Wt)},r=s.R,h=this.Te.N().lineWidth,a=this.Le(this.Ne(),r);this.Xt.ht({de:r,fe:h,pe:a.pe,ve:a.ve,ft:a.ft,ce:e})}Ee(){const t=this.Xt.ue();if(null!==t){const i=this.Le(this.Ne(),t.de);t.pe=i.pe,t.ve=i.ve,t.ft=i.ft}}Ne(){return this.Ve()?performance.now()-this.Pe:2599}Fe(t,i,n,s){const e=n+(s-n)*i;return this.Te.Qt().Xi().Y(t,e)}Le(t,i){const n=t%2600/2600;let s;for(const t of lt)if(n>=t.me&&n<=t.we){s=t;break}r(void 0!==s,"Last price animation internal logic error");const e=(n-s.me)/(s.we-s.me);return{pe:this.Fe(i,e,s.be,s.xe),ve:this.Fe(i,e,s.Se,s.Ce),ft:(h=e,a=s.ge,l=s.Me,a+(l-a)*h)};var h,a,l}}class _t extends rt{constructor(t){super(t)}oe(){const t=this.re;t.It=!1;const i=this.ae.N();if(!i.priceLineVisible||!this.ae.It())return;const n=this.ae.Ae(0===i.priceLineSource);n.ze||(t.It=!0,t.ut=n.Bi,t.R=this.ae.We(n.R),t.ct=i.priceLineWidth,t.Zt=i.priceLineStyle)}}class ut extends L{constructor(t){super(),this.Jt=t}Yi(t,i,n){t.It=!1,i.It=!1;const s=this.Jt;if(!s.It())return;const e=s.N(),r=e.lastValueVisible,h=""!==s.He(),a=0===e.seriesLastValueMode,l=s.Ae(!1);if(l.ze)return;r&&(t.ri=this.Ue(l,r,a),t.It=0!==t.ri.length),(h||a)&&(i.ri=this.$e(l,r,h,a),i.It=i.ri.length>0);const o=s.We(l.R),_=this.Jt.Qt().Xi().Z(o);n.G=_.G,n.Bi=l.Bi,i.Ht=s.Qt().Ut(l.Bi/s.Ft().$t()),t.Ht=o,t.R=_.X,i.R=_.X}$e(t,i,n,s){let e="";const r=this.Jt.He();return n&&0!==r.length&&(e+=`${r} `),i&&s&&(e+=this.Jt.Ft().je()?t.qe:t.Ye),e.trim()}Ue(t,i,n){return i?n?this.Jt.Ft().je()?t.Ye:t.qe:t.ri:""}}function ct(t,i,n,s){const e=Number.isFinite(i),r=Number.isFinite(n);return e&&r?t(i,n):e||r?e?i:n:s}class dt{constructor(t,i){this.Ke=t,this.Ze=i}Ge(t){return null!==t&&(this.Ke===t.Ke&&this.Ze===t.Ze)}Xe(){return new dt(this.Ke,this.Ze)}Je(){return this.Ke}Qe(){return this.Ze}tr(){return this.Ze-this.Ke}Gi(){return this.Ze===this.Ke||Number.isNaN(this.Ze)||Number.isNaN(this.Ke)}xs(t){return null===t?this:new dt(ct(Math.min,this.Je(),t.Je(),-1/0),ct(Math.max,this.Qe(),t.Qe(),1/0))}ir(t){if(!u(t))return;if(0===this.Ze-this.Ke)return;const i=.5*(this.Ze+this.Ke);let n=this.Ze-i,s=this.Ke-i;n*=t,s*=t,this.Ze=i+n,this.Ke=i+s}nr(t){u(t)&&(this.Ze+=t,this.Ke+=t)}sr(){return{minValue:this.Ke,maxValue:this.Ze}}static er(t){return null===t?null:new dt(t.minValue,t.maxValue)}}class ft{constructor(t,i){this.rr=t,this.hr=i||null}ar(){return this.rr}lr(){return this.hr}sr(){return{priceRange:null===this.rr?null:this.rr.sr(),margins:this.hr||void 0}}static er(t){return null===t?null:new ft(dt.er(t.priceRange),t.margins)}}const pt=[2,4,8,16,32,64,128,256,512],vt="Custom series with conflation reducer must have a priceValueBuilder method";class mt extends rt{constructor(t,i){super(t),this._r=i}oe(){const t=this.re;t.It=!1;const i=this._r.N();if(!this.ae.It()||!i.lineVisible)return;const n=this._r.ur();null!==n&&(t.It=!0,t.ut=n,t.R=i.color,t.ct=i.lineWidth,t.Zt=i.lineStyle,t.te=this._r.N().id)}}class wt extends L{constructor(t,i){super(),this.Te=t,this._r=i}Yi(t,i,n){t.It=!1,i.It=!1;const s=this._r.N(),e=s.axisLabelVisible,r=""!==s.title,h=this.Te;if(!e||!h.It())return;const a=this._r.ur();if(null===a)return;r&&(i.ri=s.title,i.It=!0),i.Ht=h.Qt().Ut(a/h.Ft().$t()),t.ri=this.cr(s.price),t.It=!0;const l=this.Te.Qt().Xi().Z(s.axisLabelColor||s.color);n.G=l.G;const o=s.axisLabelTextColor||l.X;t.R=o,i.R=o,n.Bi=a}cr(t){const i=this.Te.zt();return null===i?"":this.Te.Ft().Ji(t,i.Wt)}}class gt{constructor(t,i){this.Te=t,this.yn=i,this.dr=new mt(t,this),this.qs=new wt(t,this),this.pr=new st(this.qs,t,t.Qt())}vr(t){_(this.yn,t),this.Pt(),this.Te.Qt().mr()}N(){return this.yn}wr(){return this.dr}gr(){return this.pr}Mr(){return this.qs}Pt(){this.dr.Pt(),this.qs.Pt()}ur(){const t=this.Te,i=t.Ft();if(t.Qt().Bt().Gi()||i.Gi())return null;const n=t.zt();return null===n?null:i.Nt(this.yn.price,n.Wt)}}class Mt{constructor(){this.br=new WeakMap}Sr(t,i,n){const s=1/i*n;if(t>=s)return 1;const e=s/t,r=Math.pow(2,Math.floor(Math.log2(e)));return Math.min(r,512)}Cr(t,i,n,s=!1,e){if(0===t.length||i<=1)return t;const r=this.yr(i);if(r<=1)return t;const h=this.Pr(t);let a=h.kr.get(r);return void 0!==a||(a=this.Tr(t,r,n,s,e,h.kr),h.kr.set(r,a)),a}Rr(t,i,n,s,e=!1,r){if(n<1||0===t.length)return t;const h=this.Pr(t),a=h.kr.get(n);if(!a)return this.Cr(t,n,s,e,r);const l=this.Dr(t,i,n,a,e,s,r);return h.kr.set(n,l),l}yr(t){if(t<=2)return 2;for(const i of pt)if(t<=i)return i;return 512}Ir(t){if(0===t.length)return 0;const i=t[0],n=t[t.length-1];return 31*t.length+17*i.$n+13*n.$n}Tr(t,i,n,s=!1,e,r=new Map){if(2===i)return this.Vr(t,2,n,s,e);const h=i/2;let a=r.get(h);return a||(a=this.Tr(t,h,n,s,e,r),r.set(h,a)),this.Er(a,n,s,e)}Vr(t,i,n,s=!1,e){const r=this.Br(t,i,n,s,e);return this.Ar(r,s)}Er(t,i,n=!1,s){const e=this.Br(t,2,i,n,s);return this.Ar(e,n)}Br(t,i,n,s=!1,e){const r=[];for(let h=0;h=i){const i=this.zr(t[h],t[h+1],n,s,e);i.Or=!1,r.push(i)}else if(0===r.length)r.push(this.Lr(t[h],!0));else{const i=r[r.length-1];r[r.length-1]=this.Nr(i,t[h],n,s,e)}}return r}Fr(t,i){return(t??1)+(i??1)}zr(t,i,n,s=!1,e){if(!s||!n||!e){const n=t.Wt[1]>i.Wt[1]?t.Wt[1]:i.Wt[1],s=t.Wt[2]i.Wt[1]?t.qr:i.Wt[1],Yr:t.Yrthis.th(t,i)))}Dr(t,i,n,s,e=!1,r,h){if(0===s.length)return s;const a=t.length-1,l=Math.floor(a/n)*n;if(Math.min(l+n,t.length)-ln){const s=t.slice();return s[s.length-1]=i,this.Cr(s,n,r,e,h)}if(Math.floor((a-1)/n)===Math.floor(a/n)||1===s.length){const o=Math.min(l+n,t.length),_=o-l;if(_<=0)return s;const u=1===_?this.Lr(l===a?i:t[l],!0):this.Jr(t,l,o,a,i,r,e,h);return s[s.length-1]=this.th(u,e),s}{const s=t.slice();return s[s.length-1]=i,this.Cr(s,n,r,e,h)}}Lr(t,i=!1){return{Wr:t.$n,Hr:t.$n,Ur:t.wt,$r:t.wt,jr:t.Wt[0],qr:t.Wt[1],Yr:t.Wt[2],Kr:t.Wt[3],Zr:t.Zr??1,Gr:t.ue,Or:i}}Pr(t){const i=this.ih(t),n=this.Ir(t);return i.nh!==n&&(i.kr.clear(),i.nh=n),i}ih(t){let i=this.br.get(t);return void 0===i&&(i={nh:this.Ir(t),kr:new Map},this.br.set(t,i)),i}}class bt extends U{constructor(t){super(),this.sn=t}Qt(){return this.sn}}const xt={Bar:(t,i,n,s)=>{const e=i.upColor,r=i.downColor,h=a(t(n,s)),o=l(h.Wt[0])<=l(h.Wt[3]);return{sh:h.R??(o?e:r)}},Candlestick:(t,i,n,s)=>{const e=i.upColor,r=i.downColor,h=i.borderUpColor,o=i.borderDownColor,_=i.wickUpColor,u=i.wickDownColor,c=a(t(n,s)),d=l(c.Wt[0])<=l(c.Wt[3]);return{sh:c.R??(d?e:r),eh:c.Ht??(d?h:o),rh:c.hh??(d?_:u)}},Custom:(t,i,n,s)=>({sh:a(t(n,s)).R??i.color}),Area:(t,i,n,s)=>{const e=a(t(n,s));return{sh:e.vt??i.lineColor,vt:e.vt??i.lineColor,ah:e.ah??i.topColor,oh:e.oh??i.bottomColor}},Baseline:(t,i,n,s)=>{const e=a(t(n,s));return{sh:e.Wt[3]>=i.baseValue.price?i.topLineColor:i.bottomLineColor,_h:e._h??i.topLineColor,uh:e.uh??i.bottomLineColor,dh:e.dh??i.topFillColor1,fh:e.fh??i.topFillColor2,ph:e.ph??i.bottomFillColor1,mh:e.mh??i.bottomFillColor2}},Line:(t,i,n,s)=>{const e=a(t(n,s));return{sh:e.R??i.color,vt:e.R??i.color}},Histogram:(t,i,n,s)=>({sh:a(t(n,s)).R??i.color})};class St{constructor(t){this.wh=(t,i)=>void 0!==i?i.Wt:this.Te.Un().gh(t),this.Te=t,this.Mh=xt[t.bh()]}xh(t,i){return this.Mh(this.wh,this.Te.N(),t,i)}}function Ct(t,i,n,s,e=0,r=i.length){let h=r-e;for(;0>1,a=e+r;s(i[a],n)===t?(e=a+1,h-=r+1):h=r}return e}const yt=Ct.bind(null,!0),Pt=Ct.bind(null,!1);var kt;!function(t){t[t.NearestLeft=-1]="NearestLeft",t[t.None=0]="None",t[t.NearestRight=1]="NearestRight"}(kt||(kt={}));const Tt=30;class Rt{constructor(){this.Sh=[],this.Ch=new Map,this.yh=new Map,this.Ph=[]}kh(){return this.Th()>0?this.Sh[this.Sh.length-1]:null}Rh(){return this.Th()>0?this.Dh(0):null}Qn(){return this.Th()>0?this.Dh(this.Sh.length-1):null}Th(){return this.Sh.length}Gi(){return 0===this.Th()}Oe(t){return null!==this.Ih(t,0)}gh(t){return this.Hn(t)}Hn(t,i=0){const n=this.Ih(t,i);return null===n?null:{...this.Vh(n),$n:this.Dh(n)}}Eh(){return this.Sh}Bh(t,i,n){if(this.Gi())return null;let s=null;for(const e of n){s=Dt(s,this.Ah(t,i,e))}return s}ht(t){this.yh.clear(),this.Ch.clear(),this.Sh=t,this.Ph=t.map((t=>t.$n))}zh(){return this.Ph}Dh(t){return this.Sh[t].$n}Vh(t){return this.Sh[t]}Ih(t,i){const n=this.Oh(t);if(null===n&&0!==i)switch(i){case-1:return this.Lh(t);case 1:return this.Nh(t);default:throw new TypeError("Unknown search mode")}return n}Lh(t){let i=this.Fh(t);return i>0&&(i-=1),i!==this.Sh.length&&this.Dh(i)t.$nt.$n>i))}Hh(t,i,n){let s=null;for(let e=t;es.$h&&(s.$h=t)))}return s}Ah(t,i,n){if(this.Gi())return null;let s=null;const e=a(this.Rh()),r=a(this.Qn()),h=Math.max(t,e),l=Math.min(i,r),o=Math.ceil(h/Tt)*Tt,_=Math.max(o,Math.floor(l/Tt)*Tt);{const t=this.Fh(h),e=this.Wh(Math.min(l,o,i));s=Dt(s,this.Hh(t,e,n))}let u=this.Ch.get(n);void 0===u&&(u=new Map,this.Ch.set(n,u));for(let t=Math.max(o+1,h);t<_;t+=Tt){const i=Math.floor(t/Tt);let e=u.get(i);if(void 0===e){const t=this.Fh(i*Tt),s=this.Wh((i+1)*Tt-1);e=this.Hh(t,s,n),u.set(i,e)}s=Dt(s,e)}{const t=this.Fh(_),i=this.Wh(l);s=Dt(s,this.Hh(t,i,n))}return s}}function Dt(t,i){if(null===t)return i;if(null===i)return t;return{Uh:Math.min(t.Uh,i.Uh),$h:Math.max(t.$h,i.$h)}}function It(){return new Rt}const Vt={setLineStyle:s};class Et{constructor(t){this.jh=t}st(t,i,n){this.jh.draw(t,Vt)}qh(t,i,n){this.jh.drawBackground?.(t,Vt)}}class Bt{constructor(t){this.zs=null,this.Yh=t}Tt(){const t=this.Yh.renderer();if(null===t)return null;if(this.zs?.Kh===t)return this.zs.Zh;const i=new Et(t);return this.zs={Kh:t,Zh:i},i}Gh(){return this.Yh.zOrder?.()??"normal"}}class At{constructor(t){this.Xh=null,this.Jh=t}Qh(){return this.Jh}Nn(){this.Jh.updateAllViews?.()}jn(){const t=this.Jh.paneViews?.()??[];if(this.Xh?.Kh===t)return this.Xh.Zh;const i=t.map((t=>new Bt(t)));return this.Xh={Kh:t,Zh:i},i}Qs(t,i){return this.Jh.hitTest?.(t,i)??null}}let zt=class extends At{cn(){return[]}};class Ot{constructor(t){this.jh=t}st(t,i,n){this.jh.draw(t,Vt)}qh(t,i,n){this.jh.drawBackground?.(t,Vt)}}class Lt{constructor(t){this.zs=null,this.Yh=t}Tt(){const t=this.Yh.renderer();if(null===t)return null;if(this.zs?.Kh===t)return this.zs.Zh;const i=new Ot(t);return this.zs={Kh:t,Zh:i},i}Gh(){return this.Yh.zOrder?.()??"normal"}}function Nt(t){return{ri:t.text(),Bi:t.coordinate(),Vi:t.fixedCoordinate?.(),R:t.textColor(),G:t.backColor(),It:t.visible?.()??!0,pi:t.tickVisible?.()??!0}}class Ft{constructor(t,i){this.Xt=new W,this.ta=t,this.ia=i}Tt(){return this.Xt.ht({nn:this.ia.nn(),...Nt(this.ta)}),this.Xt}}class Wt extends L{constructor(t,i){super(),this.ta=t,this.Ki=i}Yi(t,i,n){const s=Nt(this.ta);n.G=s.G,t.R=s.R;const e=2/12*this.Ki.P();n.Ti=e,n.Ri=e,n.Bi=s.Bi,n.Vi=s.Vi,t.ri=s.ri,t.It=s.It,t.pi=s.pi}}class Ht extends At{constructor(t,i){super(t),this.na=null,this.sa=null,this.ea=null,this.ra=null,this.Te=i}dn(){const t=this.Jh.timeAxisViews?.()??[];if(this.na?.Kh===t)return this.na.Zh;const i=this.Te.Qt().Bt(),n=t.map((t=>new Ft(t,i)));return this.na={Kh:t,Zh:n},n}qn(){const t=this.Jh.priceAxisViews?.()??[];if(this.sa?.Kh===t)return this.sa.Zh;const i=this.Te.Ft(),n=t.map((t=>new Wt(t,i)));return this.sa={Kh:t,Zh:n},n}ha(){const t=this.Jh.priceAxisPaneViews?.()??[];if(this.ea?.Kh===t)return this.ea.Zh;const i=t.map((t=>new Lt(t)));return this.ea={Kh:t,Zh:i},i}aa(){const t=this.Jh.timeAxisPaneViews?.()??[];if(this.ra?.Kh===t)return this.ra.Zh;const i=t.map((t=>new Lt(t)));return this.ra={Kh:t,Zh:i},i}la(t,i){return this.Jh.autoscaleInfo?.(t,i)??null}}function Ut(t,i,n,s){t.forEach((t=>{i(t).forEach((t=>{t.Gh()===n&&s.push(t)}))}))}function $t(t){return t.jn()}function jt(t){return t.ha()}function qt(t){return t.aa()}const Yt=["Area","Line","Baseline"];class Kt extends bt{constructor(t,i,n,s,e){super(t),this.qt=It(),this.dr=new _t(this),this.oa=[],this._a=new ht(this),this.ua=null,this.ca=null,this.da=null,this.fa=[],this.pa=new Mt,this.va=new Map,this.ma=null,this.yn=n,this.wa=i;const r=new ut(this);if(this.mn=[r],this.pr=new st(r,this,t),Yt.includes(this.wa)&&(this.ua=new ot(this)),this.ga(),this.Yh=s(this,this.Qt(),e),"Custom"===this.wa){const t=this.Yh;t.Ma&&this.ba(t.Ma)}}m(){null!==this.da&&clearTimeout(this.da)}We(t){return this.yn.priceLineColor||t}Ae(t){const i={ze:!0},n=this.Ft();if(this.Qt().Bt().Gi()||n.Gi()||this.qt.Gi())return i;const s=this.Qt().Bt().Be(),e=this.zt();if(null===s||null===e)return i;let r,h;if(t){const t=this.qt.kh();if(null===t)return i;r=t,h=t.$n}else{const t=this.qt.Hn(s.bi(),-1);if(null===t)return i;if(r=this.qt.gh(t.$n),null===r)return i;h=t.$n}const a=r.Wt[3],l=this.xa().xh(h,{Wt:r}),o=n.Nt(a,e.Wt);return{ze:!1,gt:a,ri:n.Ji(a,e.Wt),qe:n.Sa(a),Ye:n.Ca(a,e.Wt),R:l.sh,Bi:o,$n:h}}xa(){return null!==this.ca||(this.ca=new St(this)),this.ca}N(){return this.yn}vr(t){const i=this.Qt(),{priceScaleId:n,visible:s,priceFormat:e}=t;void 0!==n&&n!==this.yn.priceScaleId&&i.ya(this,n),void 0!==s&&s!==this.yn.visible&&i.Pa();const r=void 0!==t.conflationThresholdFactor;_(this.yn,t),r&&(this.va.clear(),this.Qt().mr()),void 0!==e&&(this.ga(),i.ka()),i.Ta(this),i.Ra(),this.Yh.Pt("options")}ht(t,i){this.qt.ht(t),this.va.clear();const n=this.Qt().Bt().N();n.enableConflation&&n.precomputeConflationOnInit&&this.Da(n.precomputeConflationPriority),this.Yh.Pt("data"),null!==this.ua&&(i&&i.Ia?this.ua.De():0===t.length&&this.ua.Re());const s=this.Qt().Ks(this);this.Qt().Va(s),this.Qt().Ta(this),this.Qt().Ra(),this.Qt().mr()}Ea(t){const i=new gt(this,t);return this.oa.push(i),this.Qt().Ta(this),i}Ba(t){const i=this.oa.indexOf(t);-1!==i&&this.oa.splice(i,1),this.Qt().Ta(this)}Aa(){return this.oa}bh(){return this.wa}zt(){const t=this.za();return null===t?null:{Wt:t.Wt[3],Oa:t.wt}}za(){const t=this.Qt().Bt().Be();if(null===t)return null;const i=t.La();return this.qt.Hn(i,1)}Un(){return this.qt}ba(t){this.ma=t,this.va.clear()}Na(){return!!this.Qt().Bt().N().enableConflation&&this.Fa()>1}Rr(t){if(!this.Na())return;const i=this.Fa();if(!this.va.has(i))return;const n="Custom"===this.wa,s=n&&this.ma||void 0,e=n&&this.Yh.Wa?t=>{const i=t,n=this.Yh.Wa(i);return Array.isArray(n)?n:["number"==typeof n?n:0]}:void 0,r=this.pa.Rr(this.qt.Eh(),t,i,s,n,e),h=It();h.ht(r),this.va.set(i,h)}Ha(){const t=this.Qt().Bt().N().enableConflation;if("Custom"===this.wa&&null===this.ma)return this.qt;if(!t)return this.qt;const i=this.Fa(),n=this.va.get(i);if(n)return n;this.Ua(i);return this.va.get(i)??this.qt}$a(t){const i=this.qt.gh(t);return null===i?null:"Bar"===this.wa||"Candlestick"===this.wa||"Custom"===this.wa?{jr:i.Wt[0],qr:i.Wt[1],Yr:i.Wt[2],Kr:i.Wt[3]}:i.Wt[3]}ja(t){const i=[];Ut(this.fa,$t,"top",i);const n=this.ua;return null!==n&&n.It()?(null===this.da&&n.Ve()&&(this.da=setTimeout((()=>{this.da=null,this.Qt().qa()}),0)),n.Ie(),i.unshift(n),i):i}jn(){const t=[];this.Ya()||t.push(this._a),t.push(this.Yh,this.dr);const i=this.oa.map((t=>t.wr()));return t.push(...i),Ut(this.fa,$t,"normal",t),t}Ka(){return this.Za($t,"bottom")}Ga(t){return this.Za(jt,t)}Xa(t){return this.Za(qt,t)}Ja(t,i){return this.fa.map((n=>n.Qs(t,i))).filter((t=>null!==t))}cn(){return[this.pr,...this.oa.map((t=>t.gr()))]}qn(t,i){if(i!==this.hn&&!this.Ya())return[];const n=[...this.mn];for(const t of this.oa)n.push(t.Mr());return this.fa.forEach((t=>{n.push(...t.qn())})),n}dn(){const t=[];return this.fa.forEach((i=>{t.push(...i.dn())})),t}la(t,i){if(void 0!==this.yn.autoscaleInfoProvider){const n=this.yn.autoscaleInfoProvider((()=>{const n=this.Qa(t,i);return null===n?null:n.sr()}));return ft.er(n)}return this.Qa(t,i)}Kh(){const t=this.yn.priceFormat;return t.base??1/t.minMove}tl(){return this.il}Nn(){this.Yh.Pt();for(const t of this.mn)t.Pt();for(const t of this.oa)t.Pt();this.dr.Pt(),this._a.Pt(),this.ua?.Pt(),this.fa.forEach((t=>t.Nn()))}Ft(){return a(super.Ft())}At(t){if(!(("Line"===this.wa||"Area"===this.wa||"Baseline"===this.wa)&&this.yn.crosshairMarkerVisible))return null;const i=this.qt.gh(t);if(null===i)return null;return{gt:i.Wt[3],ft:this.nl(),Ht:this.sl(),Lt:this.el(),Ot:this.rl(t)}}He(){return this.yn.title}It(){return this.yn.visible}hl(t){this.fa.push(new Ht(t,this))}al(t){this.fa=this.fa.filter((i=>i.Qh()!==t))}ll(){if("Custom"===this.wa)return t=>this.Yh.Wa(t)}ol(){if("Custom"===this.wa)return t=>this.Yh._l(t)}ul(){return this.qt.zh()}Ya(){return!q(this.Ft().cl())}Qa(t,i){if(!c(t)||!c(i)||this.qt.Gi())return null;const n="Line"===this.wa||"Area"===this.wa||"Baseline"===this.wa||"Histogram"===this.wa?[3]:[2,1],s=this.qt.Bh(t,i,n);let e=null!==s?new dt(s.Uh,s.$h):null,r=null;if("Histogram"===this.bh()){const t=this.yn.base,i=new dt(t,t);e=null!==e?e.xs(i):i}return this.fa.forEach((n=>{const s=n.la(t,i);if(s?.priceRange){const t=new dt(s.priceRange.minValue,s.priceRange.maxValue);e=null!==e?e.xs(t):t}s?.margins&&(r=s.margins)})),new ft(e,r)}nl(){switch(this.wa){case"Line":case"Area":case"Baseline":return this.yn.crosshairMarkerRadius}return 0}sl(){switch(this.wa){case"Line":case"Area":case"Baseline":{const t=this.yn.crosshairMarkerBorderColor;if(0!==t.length)return t}}return null}el(){switch(this.wa){case"Line":case"Area":case"Baseline":return this.yn.crosshairMarkerBorderWidth}return 0}rl(t){switch(this.wa){case"Line":case"Area":case"Baseline":{const t=this.yn.crosshairMarkerBackgroundColor;if(0!==t.length)return t}}return this.xa().xh(t).sh}ga(){switch(this.yn.priceFormat.type){case"custom":{const t=this.yn.priceFormat.formatter;this.il={format:t,formatTickmarks:this.yn.priceFormat.tickmarksFormatter??(i=>i.map(t))};break}case"volume":this.il=new Q(this.yn.priceFormat.precision);break;case"percent":this.il=new J(this.yn.priceFormat.precision);break;default:{const t=Math.pow(10,this.yn.priceFormat.precision);this.il=new X(t,this.yn.priceFormat.minMove*t)}}null!==this.hn&&this.hn.dl()}Za(t,i){const n=[];return Ut(this.fa,t,i,n),n}Fa(){const{fl:t,pl:i,vl:n}=this.ml();return this.pa.Sr(t,i,n)}ml(){const t=this.Qt().Bt(),i=t.fl(),n=window.devicePixelRatio||1,s=t.N().conflationThresholdFactor;return{fl:i,pl:n,vl:this.yn.conflationThresholdFactor??s??1}}wl(t){const i=this.qt.Eh();let n;if("Custom"===this.wa&&null!==this.ma){const s=this.ll();if(!s)throw new Error(vt);n=this.pa.Cr(i,t,this.ma,!0,(t=>s(t)))}else n=this.pa.Cr(i,t);const s=It();return s.ht(n),s}Ua(t){const i=this.wl(t);this.va.set(t,i)}Da(t){if("Custom"===this.wa&&(null===this.ma||!this.ll()))return;this.va.clear();const i=this.Qt().Bt().gl();for(const n of i){const i=()=>{this.Ml(n)},s="object"==typeof window&&window||"object"==typeof self&&self;s?.xl?.bl?s.xl.bl((()=>{i()}),{se:t}):Promise.resolve().then((()=>i()))}}Ml(t){if(this.va.has(t))return;if(0===this.qt.Eh().length)return;const i=this.wl(t);this.va.set(t,i)}}const Zt=[3],Gt=[0,1,2,3];class Xt{constructor(t){this.yn=t}Sl(t,i,n){let s=t;if(0===this.yn.mode)return s;const e=n.kn(),r=e.zt();if(null===r)return s;const h=e.Nt(t,r),a=n.Cl().filter((t=>t instanceof Kt)).reduce(((t,s)=>{if(n.Zs(s)||!s.It())return t;const e=s.Ft(),r=s.Un();if(e.Gi()||!r.Oe(i))return t;const h=r.gh(i);if(null===h)return t;const a=l(s.zt()),o=3===this.yn.mode?Gt:Zt;return t.concat(o.map((t=>e.Nt(h.Wt[t],a.Wt))))}),[]);if(0===a.length)return s;a.sort(((t,i)=>Math.abs(t-h)-Math.abs(i-h)));const o=a[0];return s=e.Tn(o,r),s}}function Jt(t,i,n){return Math.min(Math.max(t,i),n)}function Qt(t,i,n){return i-t<=n}function ti(t){const i=Math.ceil(t);return i%2==0?i-1:i}class ii extends y{constructor(){super(...arguments),this.qt=null}ht(t){this.qt=t}et({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:e}){if(null===this.qt)return;const r=Math.max(1,Math.floor(n));t.lineWidth=r,function(t,i){t.save(),t.lineWidth%2&&t.translate(.5,.5),i(),t.restore()}(t,(()=>{const h=a(this.qt);if(h.yl){t.strokeStyle=h.Pl,s(t,h.kl),t.beginPath();for(const s of h.Tl){const e=Math.round(s.Rl*n);t.moveTo(e,-r),t.lineTo(e,i.height+r)}t.stroke()}if(h.Dl){t.strokeStyle=h.Il,s(t,h.Vl),t.beginPath();for(const n of h.El){const s=Math.round(n.Rl*e);t.moveTo(-r,s),t.lineTo(i.width+r,s)}t.stroke()}}))}}class ni{constructor(t){this.Xt=new ii,this.St=!0,this.yt=t}Pt(){this.St=!0}Tt(){if(this.St){const t=this.yt.Qt().N().grid,i={Dl:t.horzLines.visible,yl:t.vertLines.visible,Il:t.horzLines.color,Pl:t.vertLines.color,Vl:t.horzLines.style,kl:t.vertLines.style,El:this.yt.kn().Bl(),Tl:(this.yt.Qt().Bt().Bl()||[]).map((t=>({Rl:t.coord})))};this.Xt.ht(i),this.St=!1}return this.Xt}}class si{constructor(t){this.Yh=new ni(t)}wr(){return this.Yh}}const ei={Al:4,zl:1e-4};function ri(t,i){const n=100*(t-i)/i;return i<0?-n:n}function hi(t,i){const n=ri(t.Je(),i),s=ri(t.Qe(),i);return new dt(n,s)}function ai(t,i){const n=100*(t-i)/i+100;return i<0?-n:n}function li(t,i){const n=ai(t.Je(),i),s=ai(t.Qe(),i);return new dt(n,s)}function oi(t,i){const n=Math.abs(t);if(n<1e-15)return 0;const s=Math.log10(n+i.zl)+i.Al;return t<0?-s:s}function _i(t,i){const n=Math.abs(t);if(n<1e-15)return 0;const s=Math.pow(10,n-i.Al)-i.zl;return t<0?-s:s}function ui(t,i){if(null===t)return null;const n=oi(t.Je(),i),s=oi(t.Qe(),i);return new dt(n,s)}function ci(t,i){if(null===t)return null;const n=_i(t.Je(),i),s=_i(t.Qe(),i);return new dt(n,s)}function di(t){if(null===t)return ei;const i=Math.abs(t.Qe()-t.Je());if(i>=1||i<1e-15)return ei;const n=Math.ceil(Math.abs(Math.log10(i))),s=ei.Al+n;return{Al:s,zl:1/Math.pow(10,s)}}class fi{constructor(t,i){if(this.Ol=t,this.Ll=i,function(t){if(t<0)return!1;if(t>1e18)return!0;for(let i=t;i>1;i/=10)if(i%10!=0)return!1;return!0}(this.Ol))this.Nl=[2,2.5,2];else{this.Nl=[];for(let t=this.Ol;1!==t;){if(t%2==0)this.Nl.push(2),t/=2;else{if(t%5!=0)throw new Error("unexpected base");this.Nl.push(2,2.5),t/=5}if(this.Nl.length>100)throw new Error("something wrong with base")}}}Fl(t,i,n){const s=0===this.Ol?0:1/this.Ol;let e=Math.pow(10,Math.max(0,Math.ceil(Math.log10(t-i)))),r=0,h=this.Ll[0];for(;;){const t=Qt(e,s,1e-14)&&e>s+1e-14,i=Qt(e,n*h,1e-14),a=Qt(e,1,1e-14);if(!(t&&i&&a))break;e/=h,h=this.Ll[++r%this.Ll.length]}if(e<=s+1e-14&&(e=s),e=Math.max(1,e),this.Nl.length>0&&(a=e,l=1,o=1e-14,Math.abs(a-l)s+1e-14;)e/=h,h=this.Nl[++r%this.Nl.length];var a,l,o;return e}}class pi{constructor(t,i,n,s){this.Wl=[],this.Ki=t,this.Ol=i,this.Hl=n,this.Ul=s}Fl(t,i){if(tt.Jl)),c=this.Ki.Ql(u);for(let t=0;t=s?1:-1;let _=null,u=0;for(let c=n-l;c>s;c-=i){const n=this.Ul(c,t,!0);null!==_&&Math.abs(n-_)r||(u0&&h[0].Rl-a.Rl0&&l.Rl-h[h.length-1].Rla(t.ln())-a(i.ln())))}var mi;!function(t){t[t.Normal=0]="Normal",t[t.Logarithmic=1]="Logarithmic",t[t.Percentage=2]="Percentage",t[t.IndexedTo100=3]="IndexedTo100"}(mi||(mi={}));const wi=new J,gi=new X(100,1);class Mi{constructor(t,i,n,s,e){this.ho=0,this.ao=null,this.rr=null,this.lo=null,this.oo={_o:!1,uo:null},this.co=!1,this.do=0,this.fo=0,this.po=new o,this.vo=new o,this.mo=[],this.wo=null,this.Mo=null,this.bo=null,this.xo=null,this.So=null,this.il=gi,this.Co=di(null),this.yo=t,this.yn=i,this.Po=n,this.ko=s,this.To=e,this.Ro=new pi(this,100,this.Do.bind(this),this.Io.bind(this))}cl(){return this.yo}N(){return this.yn}vr(t){if(_(this.yn,t),this.dl(),void 0!==t.mode&&this.Vo({_e:t.mode}),void 0!==t.scaleMargins){const i=h(t.scaleMargins.top),n=h(t.scaleMargins.bottom);if(i<0||i>1)throw new Error(`Invalid top margin - expect value between 0 and 1, given=${i}`);if(n<0||n>1)throw new Error(`Invalid bottom margin - expect value between 0 and 1, given=${n}`);if(i+n>1)throw new Error(`Invalid margins - sum of margins must be less than 1, given=${i+n}`);this.Eo(),this.bo=null}}Bo(){return this.yn.autoScale}Ao(){return this.co}so(){return 1===this.yn.mode}je(){return 2===this.yn.mode}zo(){return 3===this.yn.mode}ro(){return this.Co}_e(){return{hs:this.yn.autoScale,Oo:this.yn.invertScale,_e:this.yn.mode}}Vo(t){const i=this._e();let n=null;void 0!==t.hs&&(this.yn.autoScale=t.hs),void 0!==t._e&&(this.yn.mode=t._e,2!==t._e&&3!==t._e||(this.yn.autoScale=!0),this.oo._o=!1),1===i._e&&t._e!==i._e&&(!function(t,i){if(null===t)return!1;const n=_i(t.Je(),i),s=_i(t.Qe(),i);return isFinite(n)&&isFinite(s)}(this.rr,this.Co)?this.yn.autoScale=!0:(n=ci(this.rr,this.Co),null!==n&&this.Lo(n))),1===t._e&&t._e!==i._e&&(n=ui(this.rr,this.Co),null!==n&&this.Lo(n));const s=i._e!==this.yn.mode;s&&(2===i._e||this.je())&&this.dl(),s&&(3===i._e||this.zo())&&this.dl(),void 0!==t.Oo&&i.Oo!==t.Oo&&(this.yn.invertScale=t.Oo,this.No()),this.vo.p(i,this._e())}Fo(){return this.vo}P(){return this.Po.fontSize}$t(){return this.ho}Wo(t){this.ho!==t&&(this.ho=t,this.Eo(),this.bo=null)}Ho(){if(this.ao)return this.ao;const t=this.$t()-this.Uo()-this.$o();return this.ao=t,t}ar(){return this.jo(),this.rr}Lo(t,i){const n=this.rr;(i||null===n&&null!==t||null!==n&&!n.Ge(t))&&(this.bo=null,this.rr=t)}qo(t){this.Lo(t),this.Yo(null!==t)}Gi(){return this.jo(),0===this.ho||!this.rr||this.rr.Gi()}Ko(t){return this.Oo()?t:this.$t()-1-t}Nt(t,i){return this.je()?t=ri(t,i):this.zo()&&(t=ai(t,i)),this.Io(t,i)}Zo(t,i,n){this.jo();const s=this.$o(),e=a(this.ar()),r=e.Je(),h=e.Qe(),l=this.Ho()-1,o=this.Oo(),_=l/(h-r),u=void 0===n?0:n.from,c=void 0===n?t.length:n.to,d=this.Go();for(let n=u;nt.Nn()))}Kl(){return this.yn.ensureEdgeTickMarksVisible&&this.Bo()}Gl(){return this.P()/2}dl(){this.bo=null;let t=1/0;this.wo=null;for(const i of this.mo)i.ln()oi(t,this.Co):null}b_(t,i,n){return void 0===i?(void 0===n&&(n=this.tl()),n.format(t)):i(t)}x_(t,i,n){return void 0===i?(void 0===n&&(n=this.tl()),n.formatTickmarks(t)):i(t)}cr(t,i){return this.b_(t,this.ko.priceFormatter,i)}v_(t,i){const n=this.ko.priceFormatter;return this.x_(t,this.ko.tickmarksPriceFormatter??(n?t=>t.map(n):void 0),i)}f_(t,i){return this.b_(t,this.ko.percentageFormatter,i)}p_(t,i){const n=this.ko.percentageFormatter;return this.x_(t,this.ko.tickmarksPercentageFormatter??(n?t=>t.map(n):void 0),i)}}function bi(t){return t instanceof Kt}class xi{constructor(t,i){this.mo=[],this.S_=new Map,this.ho=0,this.C_=0,this.y_=1,this.Mo=null,this.P_=null,this.k_=!1,this.T_=new o,this.fa=[],this.ia=t,this.sn=i,this.R_=new si(this);const n=i.N();this.D_=this.I_("left",n.leftPriceScale),this.V_=this.I_("right",n.rightPriceScale),this.D_.Fo().i(this.E_.bind(this,this.D_),this),this.V_.Fo().i(this.E_.bind(this,this.V_),this),this.B_(n)}B_(t){if(t.leftPriceScale&&this.D_.vr(t.leftPriceScale),t.rightPriceScale&&this.V_.vr(t.rightPriceScale),t.localization&&(this.D_.dl(),this.V_.dl()),t.overlayPriceScales){const i=Array.from(this.S_.values());for(const n of i){const i=a(n[0].Ft());i.vr(t.overlayPriceScales),t.localization&&i.dl()}}}A_(t){switch(t){case"left":return this.D_;case"right":return this.V_}return this.S_.has(t)?h(this.S_.get(t))[0].Ft():null}m(){this.Qt().z_().u(this),this.D_.Fo().u(this),this.V_.Fo().u(this),this.mo.forEach((t=>{t.m&&t.m()})),this.fa=this.fa.filter((t=>{const i=t.Qh();return i.detached&&i.detached(),!1})),this.T_.p()}O_(){return this.y_}L_(t){this.y_=t}Qt(){return this.sn}nn(){return this.C_}$t(){return this.ho}N_(t){this.C_=t,this.F_()}Wo(t){this.ho=t,this.D_.Wo(t),this.V_.Wo(t),this.mo.forEach((i=>{if(this.Zs(i)){const n=i.Ft();null!==n&&n.Wo(t)}})),this.F_()}W_(t){this.k_=t}H_(){return this.k_}U_(){return this.mo.filter(bi)}Cl(){return this.mo}Zs(t){const i=t.Ft();return null===i||this.D_!==i&&this.V_!==i}s_(t,i,n){this.j_(t,i,n?t.ln():this.mo.length)}r_(t,i){const n=this.mo.indexOf(t);r(-1!==n,"removeDataSource: invalid data source"),this.mo.splice(n,1),i||this.mo.forEach(((t,i)=>t._n(i)));const s=a(t.Ft()).cl();if(this.S_.has(s)){const i=h(this.S_.get(s)),n=i.indexOf(t);-1!==n&&(i.splice(n,1),0===i.length&&this.S_.delete(s))}const e=t.Ft();e&&e.Cl().indexOf(t)>=0&&(e.r_(t),this.q_(e)),this.Y_()}Xs(t){return t===this.D_?"left":t===this.V_?"right":"overlay"}K_(){return this.D_}Z_(){return this.V_}G_(t,i){t.l_(i)}X_(t,i){t.o_(i),this.F_()}J_(t){t.__()}Q_(t,i){t.u_(i)}tu(t,i){t.c_(i),this.F_()}iu(t){t.d_()}F_(){this.mo.forEach((t=>{t.Nn()}))}kn(){const[t,i]=this.nu();let n=null;return t.N().visible&&0!==t.Cl().length?n=t:i.N().visible&&0!==i.Cl().length?n=i:0!==this.mo.length&&(n=this.mo[0].Ft()),null===n&&(n=this.Gs()??t),n}Gs(){const[t,i]=this.nu();return t.N().visible?t:i.N().visible?i:null}q_(t){null!==t&&t.Bo()&&this.su(t)}eu(t){const i=this.ia.Be();t.Vo({hs:!0}),null!==i&&t.w_(i),this.F_()}ru(){this.su(this.D_),this.su(this.V_)}hu(){this.q_(this.D_),this.q_(this.V_),this.mo.forEach((t=>{this.Zs(t)&&this.q_(t.Ft())})),this.F_(),this.sn.mr()}Dt(){return null===this.Mo&&(this.Mo=vi(this.mo)),this.Mo}au(){const t=this.Dt(),i=this.sn.ou()?.lu,n=this.sn.N().hoveredSeriesOnTop,s=this.P_;if(null!==s&&s.Kh===t&&s._u===i&&s.uu===n)return s.cu;const e=function(t,i,n){if(!n)return t;const s=t.indexOf(i);if(-1===s||s===t.length-1)return t;const e=[];for(let i=0;it._n(i))),this.Y_();for(const t of[this.D_,this.V_])t.e_(),t.dl();this.sn.mr()}Vt(){return this.Dt().filter(bi)}fu(){return this.T_}pu(){return this.R_}hl(t){this.fa.push(new zt(t))}al(t){this.fa=this.fa.filter((i=>i.Qh()!==t)),t.detached&&t.detached(),this.sn.mr()}vu(){return this.fa}Ja(t,i){return this.fa.map((n=>n.Qs(t,i))).filter((t=>null!==t))}su(t){const i=t.m_();if(i&&i.length>0&&!this.ia.Gi()){const i=this.ia.Be();null!==i&&t.w_(i)}t.Nn()}j_(t,i,n){let s=this.A_(i);if(null===s&&(s=this.I_(i,this.sn.N().overlayPriceScales)),this.mo.splice(n,0,t),!q(i)){const n=this.S_.get(i)||[];n.push(t),this.S_.set(i,n)}t._n(n),s.s_(t),t.un(s),this.q_(s),this.Y_()}Y_(){this.Mo=null,this.P_=null}nu(){return"left"===this.sn.N().defaultVisiblePriceScaleId?[this.D_,this.V_]:[this.V_,this.D_]}E_(t,i,n){i._e!==n._e&&this.su(t)}I_(t,i){const n={visible:!0,autoScale:!0,...p(i)},s=new Mi(t,n,this.sn.N().layout,this.sn.N().localization,this.sn.Xi());return s.Wo(this.$t()),s}}function Si(t,i){return null===i||(2===t.se&&2!==i.se||(2!==i.se||2===t.se)&&(t.ne!==i.ne&&t.ne= left"),this.Pu=t,this.ku=i}La(){return this.Pu}bi(){return this.ku}Tu(){return this.ku-this.Pu+1}Oe(t){return this.Pu<=t&&t<=this.ku}Ge(t){return this.Pu===t.La()&&this.ku===t.bi()}}function Vi(t,i){return null===t||null===i?t===i:t.Ge(i)}class Ei{constructor(){this.Ru=new Map,this.zs=null,this.Du=!1}Iu(t){this.Du=t,this.zs=null}Vu(t,i){this.Eu(i),this.zs=null;for(let n=i;n{t<=n[0].index?i.push(s):n.splice(yt(n,t,(i=>i.index!i||n.has(t.index);for(const i of Array.from(this.Ru.keys()).sort(((t,i)=>i-t))){if(!this.Ru.get(i))continue;const n=s;s=[];const r=n.length;let a=0;const l=h(this.Ru.get(i)),o=l.length;let _=1/0,u=-1/0;for(let i=0;i=t&&o-u>=t&&e(h))s.push(h),u=o;else if(this.Du)return n}for(;ai.weight?t:i}class zi{constructor(t,i,n,s){this.C_=0,this.Uu=null,this.$u=[],this.So=null,this.xo=null,this.ju=new Ei,this.qu=new Map,this.Yu=Bi.Hu(),this.Ku=!0,this.Zu=new o,this.Gu=new o,this.Xu=new o,this.Ju=null,this.Qu=null,this.tc=new Map,this.nc=-1,this.sc=[],this.ec=1,this.yn=i,this.ko=n,this.rc=i.rightOffset,this.hc=i.barSpacing,this.sn=t,this.ac(i),this.Su=s,this.lc(),this.ju.Iu(i.uniformDistribution),this.oc(),this._c()}N(){return this.yn}uc(t){_(this.ko,t),this.cc(),this.lc()}vr(t,i){_(this.yn,t),this.yn.fixLeftEdge&&this.dc(),this.yn.fixRightEdge&&this.fc(),void 0!==t.barSpacing&&this.sn.gs(t.barSpacing),void 0!==t.rightOffset&&this.sn.Ms(t.rightOffset),this.ac(t),void 0===t.minBarSpacing&&void 0===t.maxBarSpacing||this.sn.gs(t.barSpacing??this.hc),void 0!==t.ignoreWhitespaceIndices&&t.ignoreWhitespaceIndices!==this.yn.ignoreWhitespaceIndices&&this._c(),this.cc(),this.lc(),void 0===t.enableConflation&&void 0===t.conflationThresholdFactor||this.oc(),this.Xu.p()}Rn(t){return this.$u[t]?.time??null}en(t){return this.$u[t]??null}vc(t,i){if(this.$u.length<1)return null;if(this.Su.key(t)>this.Su.key(this.$u[this.$u.length-1].time))return i?this.$u.length-1:null;const n=yt(this.$u,this.Su.key(t),((t,i)=>this.Su.key(t.time)0}Be(){return this.wc(),this.Yu.Fu()}gc(){return this.wc(),this.Yu.Wu()}Mc(){const t=this.Be();if(null===t)return null;const i={from:t.La(),to:t.bi()};return this.bc(i)}bc(t){const i=Math.round(t.from),n=Math.round(t.to),s=a(this.xc()),e=a(this.Sc());return{from:a(this.en(Math.max(s,i))),to:a(this.en(Math.min(e,n)))}}Cc(t){return{from:a(this.vc(t.from,!0)),to:a(this.vc(t.to,!0))}}nn(){return this.C_}N_(t){if(!isFinite(t)||t<=0)return;if(this.C_===t)return;const i=this.gc(),n=this.C_;if(this.C_=t,this.Ku=!0,this.yn.lockVisibleTimeRangeOnResize&&0!==n){const i=this.hc*t/n;this.hc=i}if(this.yn.fixLeftEdge&&null!==i&&i.La()<=0){const i=n-t;this.rc-=Math.round(i/this.hc)+1,this.Ku=!0}this.yc(),this.Pc()}jt(t){if(this.Gi()||!c(t))return 0;const i=this.kc()+this.rc-t;return this.C_-(i+.5)*this.hc-1}Tc(t,i){const n=this.kc(),s=void 0===i?0:i.from,e=void 0===i?t.length:i.to;for(let i=s;ii/2&&!_?n.needAlignCoordinate=!1:n.needAlignCoordinate=u&&t.index<=l||c&&t.index>=o,d++}return this.sc.length=d,this.Qu=this.sc,this.sc}Lc(){let t;this.Ku=!0,this.gs(this.yn.barSpacing),t=void 0!==this.yn.rightOffsetPixels?this.yn.rightOffsetPixels/this.fl():this.yn.rightOffset,this.Ms(t)}Nc(t){this.Ku=!0,this.Uu=t,this.Pc(),this.dc()}Fc(t,i){const n=this.Dc(t),s=this.fl(),e=s+i*(s/10);this.gs(e),this.yn.rightBarStaysOnScroll||this.Ms(this.Ac()+(n-this.Dc(t)))}l_(t){this.So&&this.d_(),null===this.xo&&null===this.Ju&&(this.Gi()||(this.xo=t,this.Wc()))}o_(t){if(null===this.Ju)return;const i=Jt(this.C_-t,0,this.C_),n=Jt(this.C_-a(this.xo),0,this.C_);0!==i&&0!==n&&this.gs(this.Ju.fl*i/n)}__(){null!==this.xo&&(this.xo=null,this.Hc())}u_(t){null===this.So&&null===this.Ju&&(this.Gi()||(this.So=t,this.Wc()))}c_(t){if(null===this.So)return;const i=(this.So-t)/this.fl();this.rc=a(this.Ju).Ac+i,this.Ku=!0,this.Pc()}d_(){null!==this.So&&(this.So=null,this.Hc())}Uc(){this.$c(this.yn.rightOffset)}$c(t,i=400){if(!isFinite(t))throw new RangeError("offset is required and must be finite number");if(!isFinite(i)||i<=0)throw new RangeError("animationDuration (optional) must be finite positive number");const n=this.rc,s=performance.now();this.sn.ps({jc:t=>(t-s)/i>=1,qc:e=>{const r=(e-s)/i;return r>=1?t:n+(t-n)*r}})}Pt(t,i){this.Ku=!0,this.$u=t,this.ju.Vu(t,i),this.Pc()}Yc(){return this.Zu}Kc(){return this.Gu}Zc(){return this.Xu}kc(){return this.Uu||0}Gc(t,i){const n=t.Tu(),s=i&&this.yn.rightOffsetPixels||0;this.Bc((this.C_-s)/n),this.rc=t.bi()-this.kc(),i&&(this.rc=s?s/this.fl():this.yn.rightOffset),this.Pc(),this.Ku=!0,this.sn.Ec(),this.sn.mr()}Xc(){const t=this.xc(),i=this.Sc();if(null===t||null===i)return;const n=!this.yn.rightOffsetPixels&&this.yn.rightOffset||0;this.Gc(new Ii(t,i+n),!0)}Jc(t){const i=new Ii(t.from,t.to);this.Gc(i)}rn(t){return void 0!==this.ko.timeFormatter?this.ko.timeFormatter(t.originalTime):this.Su.formatHorzItem(t.time)}_c(){if(!this.yn.ignoreWhitespaceIndices)return;this.tc.clear();const t=this.sn.Jn();for(const i of t)for(const t of i.ul())this.tc.set(t,!0);this.nc++}Qc(){return this.ec}gl(){const t=1/(window.devicePixelRatio||1),i=this.yn.minBarSpacing;if(i>=t)return[1];const n=[1];let s=2;for(;s<=512;){i0?this.yn.maxBarSpacing:.5*this.C_}ed(){return this.yn.fixLeftEdge&&this.yn.fixRightEdge&&0!==this.$u.length?this.C_/this.$u.length:this.yn.minBarSpacing}oc(){if(!this.yn.enableConflation)return void(this.ec=1);const t=1/(window.devicePixelRatio||1)*(this.yn.conflationThresholdFactor??1);if(this.hc>=t)return void(this.ec=1);const i=t/this.hc,n=Math.pow(2,Math.floor(Math.log2(i)));this.ec=Math.min(n,512)}Pc(){const t=this.hd();null!==t&&this.rci&&(this.rc=i,this.Ku=!0)}hd(){const t=this.xc(),i=this.Uu;if(null===t||null===i)return null;return t-i-1+(this.yn.fixLeftEdge?this.C_/this.hc:Math.min(2,this.$u.length))}ad(){return this.yn.fixRightEdge?0:this.C_/this.hc-Math.min(2,this.$u.length)}Wc(){this.Ju={fl:this.fl(),Ac:this.Ac()}}Hc(){this.Ju=null}Oc(t){let i=this.qu.get(t.weight);return void 0===i&&(i=new Di((t=>this.ld(t)),this.Su),this.qu.set(t.weight,i)),i.Cu(t)}ld(t){return this.Su.formatTickmark(t,this.ko)}sd(t){const i=this.Yu;this.Yu=t,Vi(i.Fu(),this.Yu.Fu())||this.Zu.p(),Vi(i.Wu(),this.Yu.Wu())||this.Gu.p(),this.nd()}nd(){this.Qu=null}cc(){this.nd(),this.qu.clear()}lc(){this.Su.updateFormatter(this.ko)}dc(){if(!this.yn.fixLeftEdge)return;const t=this.xc();if(null===t)return;const i=this.Be();if(null===i)return;const n=i.La()-t;if(n<0){const t=this.rc-n-1;this.Ms(t)}this.yc()}fc(){this.Pc(),this.yc()}Ic(t){return!this.yn.ignoreWhitespaceIndices||(this.tc.get(t)||!1)}Vc(t){const i=function*(t){const i=Math.round(t),n=in)break}return t}ac(t){if(void 0!==t.rightOffsetPixels){const i=t.rightOffsetPixels/(t.barSpacing||this.hc);this.sn.Ms(i)}}}var Oi,Li,Ni,Fi,Wi;!function(t){t[t.OnTouchEnd=0]="OnTouchEnd",t[t.OnNextTap=1]="OnNextTap"}(Oi||(Oi={}));class Hi{constructor(t,i,n){this.od=[],this._d=[],this.ud=null,this.C_=0,this.dd=null,this.fd=new o,this.pd=new o,this.vd=null,this.md=t,this.yn=i,this.Su=n,this.To=new S(this.yn.layout.colorParsers),this.wd=new M(this),this.ia=new zi(this,i.timeScale,this.yn.localization,n),this.Ct=new j(this,i.crosshair),this.gd=new Xt(i.crosshair),i.addDefaultPane&&(this.Md(0),this.od[0].L_(2)),this.bd=this.xd(0),this.Sd=this.xd(1)}ka(){this.Cd(Y.ys())}mr(){this.Cd(Y.Cs())}qa(){this.Cd(new Y(1))}Ta(t){const i=this.yd(t);this.Cd(i)}ou(){return this.dd}Pd(t){if(this.dd?.lu===t?.lu&&this.dd?.wu?.te===t?.wu?.te&&this.dd?.wu?.ie===t?.wu?.ie&&this.dd?.mu===t?.mu&&this.dd?.ee===t?.ee)return;const i=this.dd;this.dd=t,null!==i&&this.Ta(i.lu),null!==t&&t.lu!==i?.lu&&this.Ta(t.lu)}N(){return this.yn}vr(t){_(this.yn,t),this.od.forEach((i=>i.B_(t))),void 0!==t.timeScale&&this.ia.vr(t.timeScale),void 0!==t.localization&&this.ia.uc(t.localization),(t.leftPriceScale||t.rightPriceScale)&&this.fd.p(),this.bd=this.xd(0),this.Sd=this.xd(1),this.ka()}kd(t,i,n=0){const s=this.od[n];if(void 0===s)return;if("left"===t)return _(this.yn,{leftPriceScale:i}),s.B_({leftPriceScale:i}),this.fd.p(),void this.ka();if("right"===t)return _(this.yn,{rightPriceScale:i}),s.B_({rightPriceScale:i}),this.fd.p(),void this.ka();const e=this.Td(t,n);null!==e&&(e.Ft.vr(i),this.fd.p())}Td(t,i){const n=this.od[i];if(void 0===n)return null;const s=n.A_(t);return null!==s?{Kn:n,Ft:s}:null}Bt(){return this.ia}Zn(){return this.od}Rd(){return this.Ct}Dd(){return this.pd}Id(t,i){t.Wo(i),this.Ec()}N_(t){this.C_=t,this.ia.N_(this.C_),this.od.forEach((i=>i.N_(t))),this.Ec()}Vd(t){1!==this.od.length&&(r(t>=0&&t=0&&tt+i.O_()),0),e=this.od.reduce(((t,i)=>t+i.$t()),0),h=e-30*(this.od.length-1);i=Math.min(h,Math.max(30,i));const a=s/e,l=n.$t();n.L_(i*a);let o=i-l,_=this.od.length-1;for(const t of this.od)if(t!==n){const i=Math.min(h,Math.max(30,t.$t()-o/_));o-=t.$t()-i,_-=1;const n=i*a;t.L_(n)}this.ka()}Bd(t,i){r(t>=0&&t=0&&i=0&&t=0&&it.It()))),this.ud}Pa(){this.ud=null}jd(t,i,n,s,e){this.Ct.In(t,i);let r=NaN,h=this.ia.Rc(t,!0);const a=this.ia.Be();null!==a&&(h=Math.min(Math.max(a.La(),h),a.bi())),h=this.Ct.Fn(h);const l=s.kn(),o=l.zt();if(null!==o&&(r=l.Tn(i,o)),r=this.gd.Sl(r,h,s),this.Ct.An(h,r,s),this.qa(),!e){const e=Ri(s,t,i);this.Pd(e&&{lu:e.lu,wu:e.wu,mu:e.mu||null,ee:e.ee}),this.pd.p(this.Ct.Et(),{x:t,y:i},n)}}qd(t,i,n){const s=n.kn(),e=s.zt(),r=s.Nt(t,a(e)),h=this.ia.vc(i,!0),l=this.ia.jt(a(h));this.jd(l,r,null,n,!0)}Yd(t){this.Rd().On(),this.qa(),t||this.pd.p(null,null,null)}Ra(){const t=this.Ct.Kn();if(null!==t){const i=this.Ct.En(),n=this.Ct.Bn();this.jd(i,n,null,t)}this.Ct.Nn()}Kd(t,i,n){const s=this.ia.Rn(0);void 0!==i&&void 0!==n&&this.ia.Pt(i,n);const e=this.ia.Rn(0),r=this.ia.kc(),h=this.ia.Be();if(null!==h&&null!==s&&null!==e){const i=h.Oe(r),a=this.Su.key(s)>this.Su.key(e),l=null!==t&&t>r&&!a,o=this.ia.N().allowShiftVisibleRangeOnWhitespaceReplacement,_=i&&(!(void 0===n)||o)&&this.ia.N().shiftVisibleRangeOnNewBar;if(l&&!_){const i=t-r;this.ia.Ms(this.ia.Ac()-i)}}this.ia.Nc(t)}Va(t){null!==t&&t.hu()}Ks(t){if(function(t){return t instanceof xi}(t))return t;const i=this.od.find((i=>i.Dt().includes(t)));return void 0===i?null:i}Ec(){this.od.forEach((t=>t.hu())),this.Ra()}m(){this.od.forEach((t=>t.m())),this.od.length=0,this.yn.localization.priceFormatter=void 0,this.yn.localization.percentageFormatter=void 0,this.yn.localization.timeFormatter=void 0}Zd(){return this.wd}Js(){return this.wd.N()}z_(){return this.fd}Gd(t,i){const n=this.Md(i);this.Xd(t,n),this._d.push(t),this.Pa(),1===this._d.length?this.ka():this.mr()}Jd(t){const i=this.Ks(t),n=this._d.indexOf(t);r(-1!==n,"Series not found");const s=a(i);this._d.splice(n,1),s.r_(t),t.m&&t.m(),this.Pa(),this.ia._c(),this.Qd(s)}ya(t,i){const n=a(this.Ks(t));n.r_(t,!0),n.s_(t,i,!0)}Xc(){const t=Y.Cs();t.us(),this.Cd(t)}tf(t){const i=Y.Cs();i.fs(t),this.Cd(i)}ws(){const t=Y.Cs();t.ws(),this.Cd(t)}gs(t){const i=Y.Cs();i.gs(t),this.Cd(i)}Ms(t){const i=Y.Cs();i.Ms(t),this.Cd(i)}ps(t){const i=Y.Cs();i.ps(t),this.Cd(i)}cs(){const t=Y.Cs();t.cs(),this.Cd(t)}if(){const t=this.yn.defaultVisiblePriceScaleId,i=this.yn.leftPriceScale.visible;return i!==this.yn.rightPriceScale.visible?i?"left":"right":t}nf(t,i){r(i>=0,"Index should be greater or equal to 0");if(i===this.sf(t))return;const n=a(this.Ks(t));n.r_(t);const s=this.Md(i);this.Xd(t,s);let e=!1;0===n.Cl().length&&(e=this.Qd(n)),e||this.ka()}ef(){return this.Sd}$(){return this.bd}Ut(t){const i=this.Sd,n=this.bd;if(i===n)return i;if(t=Math.max(0,Math.min(100,Math.round(100*t))),null===this.vd||this.vd.ah!==n||this.vd.oh!==i)this.vd={ah:n,oh:i,rf:new Map};else{const i=this.vd.rf.get(t);if(void 0!==i)return i}const s=this.To.tt(n,i,t/100);return this.vd.rf.set(t,s),s}hf(t){return this.od.indexOf(t)}Xi(){return this.To}af(){return this.lf()}lf(t){const i=new xi(this.ia,this);this.od.push(i);const n=t??this.od.length-1,s=Y.ys();return s.es(n,{rs:0,hs:!0}),this.Cd(s),i}Md(t){return r(t>=0,"Index should be greater or equal to 0"),(t=Math.min(this.od.length,t))i.U_().includes(t)))}zd(t,i){const n=new Y(i);if(null!==t){const s=this.od.indexOf(t);n.es(s,{rs:i})}return n}yd(t,i){return void 0===i&&(i=2),this.zd(this.Ks(t),i)}Cd(t){this.md&&this.md(t),this.od.forEach((t=>t.pu().wr().Pt()))}Xd(t,i){const n=t.N().priceScaleId,s=void 0!==n?n:this.if();i.s_(t,s),q(s)||t.vr(t.N())}xd(t){const i=this.yn.layout;return"gradient"===i.background.type?0===t?i.background.topColor:i.background.bottomColor:i.background.color}Qd(t){return!t.H_()&&0===t.Cl().length&&this.od.length>1&&(this.od.splice(this.hf(t),1),this.ka(),!0)}}function Ui(t){if(t>=1)return 0;let i=0;for(;i<8;i++){const n=Math.round(t);if(Math.abs(n-t)<1e-8)return i;t*=10}return i}function $i(t){return!u(t)&&!d(t)}function ji(t){return u(t)}!function(t){t[t.Disabled=0]="Disabled",t[t.Continuous=1]="Continuous",t[t.OnDataUpdate=2]="OnDataUpdate"}(Li||(Li={})),function(t){t[t.LastBar=0]="LastBar",t[t.LastVisible=1]="LastVisible"}(Ni||(Ni={})),function(t){t.Solid="solid",t.VerticalGradient="gradient"}(Fi||(Fi={})),function(t){t[t.Year=0]="Year",t[t.Month=1]="Month",t[t.DayOfMonth=2]="DayOfMonth",t[t.Time=3]="Time",t[t.TimeWithSeconds=4]="TimeWithSeconds"}(Wi||(Wi={}));const qi=t=>t.getUTCFullYear();function Yi(t,i,n){return i.replace(/yyyy/g,(t=>G(qi(t),4))(t)).replace(/yy/g,(t=>G(qi(t)%100,2))(t)).replace(/MMMM/g,((t,i)=>new Date(t.getUTCFullYear(),t.getUTCMonth(),1).toLocaleString(i,{month:"long"}))(t,n)).replace(/MMM/g,((t,i)=>new Date(t.getUTCFullYear(),t.getUTCMonth(),1).toLocaleString(i,{month:"short"}))(t,n)).replace(/MM/g,(t=>G((t=>t.getUTCMonth()+1)(t),2))(t)).replace(/dd/g,(t=>G((t=>t.getUTCDate())(t),2))(t))}class Ki{constructor(t="yyyy-MM-dd",i="default"){this._f=t,this.uf=i}Cu(t){return Yi(t,this._f,this.uf)}}class Zi{constructor(t){this.cf=t||"%h:%m:%s"}Cu(t){return this.cf.replace("%h",G(t.getUTCHours(),2)).replace("%m",G(t.getUTCMinutes(),2)).replace("%s",G(t.getUTCSeconds(),2))}}const Gi={df:"yyyy-MM-dd",ff:"%h:%m:%s",pf:" ",vf:"default"};class Xi{constructor(t={}){const i={...Gi,...t};this.mf=new Ki(i.df,i.vf),this.wf=new Zi(i.ff),this.gf=i.pf}Cu(t){return`${this.mf.Cu(t)}${this.gf}${this.wf.Cu(t)}`}}function Ji(t){return 60*t*60*1e3}function Qi(t){return 60*t*1e3}const tn=[{Mf:(nn=1,1e3*nn),bf:10},{Mf:Qi(1),bf:20},{Mf:Qi(5),bf:21},{Mf:Qi(30),bf:22},{Mf:Ji(1),bf:30},{Mf:Ji(3),bf:31},{Mf:Ji(6),bf:32},{Mf:Ji(12),bf:33}];var nn;function sn(t,i){if(t.getUTCFullYear()!==i.getUTCFullYear())return 70;if(t.getUTCMonth()!==i.getUTCMonth())return 60;if(t.getUTCDate()!==i.getUTCDate())return 50;for(let n=tn.length-1;n>=0;--n)if(Math.floor(i.getTime()/tn[n].Mf)!==Math.floor(t.getTime()/tn[n].Mf))return tn[n].bf;return 0}function en(t){let i=t;if(d(t)&&(i=hn(t)),!$i(i))throw new Error("time must be of type BusinessDay");const n=new Date(Date.UTC(i.year,i.month-1,i.day,0,0,0,0));return{xf:Math.round(n.getTime()/1e3),Sf:i}}function rn(t){if(!ji(t))throw new Error("time must be of type isUTCTimestamp");return{xf:t}}function hn(t){const i=new Date(t);if(isNaN(i.getTime()))throw new Error(`Invalid date string=${t}, expected format=yyyy-mm-dd`);return{day:i.getUTCDate(),month:i.getUTCMonth()+1,year:i.getUTCFullYear()}}function an(t){d(t.time)&&(t.time=hn(t.time))}class ln{options(){return this.yn}setOptions(t){this.yn=t,this.updateFormatter(t.localization)}preprocessData(t){Array.isArray(t)?function(t){t.forEach(an)}(t):an(t)}createConverterToInternalObj(t){return a(function(t){return 0===t.length?null:$i(t[0].time)||d(t[0].time)?en:rn}(t))}key(t){return"object"==typeof t&&"xf"in t?t.xf:this.key(this.convertHorzItemToInternal(t))}cacheKey(t){const i=t;return void 0===i.Sf?new Date(1e3*i.xf).getTime():new Date(Date.UTC(i.Sf.year,i.Sf.month-1,i.Sf.day)).getTime()}convertHorzItemToInternal(t){return ji(i=t)?rn(i):$i(i)?en(i):en(hn(i));var i}updateFormatter(t){if(!this.yn)return;const i=t.dateFormat;this.yn.timeScale.timeVisible?this.Cf=new Xi({df:i,ff:this.yn.timeScale.secondsVisible?"%h:%m:%s":"%h:%m",pf:" ",vf:t.locale}):this.Cf=new Ki(i,t.locale)}formatHorzItem(t){const i=t;return this.Cf.Cu(new Date(1e3*i.xf))}formatTickmark(t,i){const n=function(t,i,n){switch(t){case 0:case 10:return i?n?4:3:2;case 20:case 21:case 22:case 30:case 31:case 32:case 33:return i?3:2;case 50:return 2;case 60:return 1;case 70:return 0}}(t.weight,this.yn.timeScale.timeVisible,this.yn.timeScale.secondsVisible),s=this.yn.timeScale;if(void 0!==s.tickMarkFormatter){const e=s.tickMarkFormatter(t.originalTime,n,i.locale);if(null!==e)return e}return function(t,i,n){const s={};switch(i){case 0:s.year="numeric";break;case 1:s.month="short";break;case 2:s.day="numeric";break;case 3:s.hour12=!1,s.hour="2-digit",s.minute="2-digit";break;case 4:s.hour12=!1,s.hour="2-digit",s.minute="2-digit",s.second="2-digit"}const e=void 0===t.Sf?new Date(1e3*t.xf):new Date(Date.UTC(t.Sf.year,t.Sf.month-1,t.Sf.day));return new Date(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()).toLocaleString(n,s)}(t.time,n,i.locale)}maxTickMarkWeight(t){let i=t.reduce(Ai,t[0]).weight;return i>30&&i<50&&(i=30),i}fillWeightsForPoints(t,i){!function(t,i=0){if(0===t.length)return;let n=0===i?null:t[i-1].time.xf,s=null!==n?new Date(1e3*n):null,e=0;for(let r=i;r1){const i=Math.ceil(e/(t.length-1)),n=new Date(1e3*(t[0].time.xf-i));t[0].timeWeight=sn(new Date(1e3*t[0].time.xf),n)}}(t,i)}static yf(t){return _({localization:{dateFormat:"dd MMM 'yy"}},t??{})}}function on(t){var i=t.width,n=t.height;if(i<0)throw new Error("Negative width is not allowed for Size");if(n<0)throw new Error("Negative height is not allowed for Size");return{width:i,height:n}}function _n(t,i){return t.width===i.width&&t.height===i.height}var un=function(){function t(t){var i=this;this._resolutionListener=function(){return i._onResolutionChanged()},this._resolutionMediaQueryList=null,this._observers=[],this._window=t,this._installResolutionListener()}return t.prototype.dispose=function(){this._uninstallResolutionListener(),this._window=null},Object.defineProperty(t.prototype,"value",{get:function(){return this._window.devicePixelRatio},enumerable:!1,configurable:!0}),t.prototype.subscribe=function(t){var i=this,n={next:t};return this._observers.push(n),{unsubscribe:function(){i._observers=i._observers.filter((function(t){return t!==n}))}}},t.prototype._installResolutionListener=function(){if(null!==this._resolutionMediaQueryList)throw new Error("Resolution listener is already installed");var t=this._window.devicePixelRatio;this._resolutionMediaQueryList=this._window.matchMedia("all and (resolution: ".concat(t,"dppx)")),this._resolutionMediaQueryList.addListener(this._resolutionListener)},t.prototype._uninstallResolutionListener=function(){null!==this._resolutionMediaQueryList&&(this._resolutionMediaQueryList.removeListener(this._resolutionListener),this._resolutionMediaQueryList=null)},t.prototype._reinstallResolutionListener=function(){this._uninstallResolutionListener(),this._installResolutionListener()},t.prototype._onResolutionChanged=function(){var t=this;this._observers.forEach((function(i){return i.next(t._window.devicePixelRatio)})),this._reinstallResolutionListener()},t}();var cn=function(){function t(t,i,n){var s;this._canvasElement=null,this._bitmapSizeChangedListeners=[],this._suggestedBitmapSize=null,this._suggestedBitmapSizeChangedListeners=[],this._devicePixelRatioObservable=null,this._canvasElementResizeObserver=null,this._canvasElement=t,this._canvasElementClientSize=on({width:this._canvasElement.clientWidth,height:this._canvasElement.clientHeight}),this._transformBitmapSize=null!=i?i:function(t){return t},this._allowResizeObserver=null===(s=null==n?void 0:n.allowResizeObserver)||void 0===s||s,this._chooseAndInitObserver()}return t.prototype.dispose=function(){var t,i;if(null===this._canvasElement)throw new Error("Object is disposed");null===(t=this._canvasElementResizeObserver)||void 0===t||t.disconnect(),this._canvasElementResizeObserver=null,null===(i=this._devicePixelRatioObservable)||void 0===i||i.dispose(),this._devicePixelRatioObservable=null,this._suggestedBitmapSizeChangedListeners.length=0,this._bitmapSizeChangedListeners.length=0,this._canvasElement=null},Object.defineProperty(t.prototype,"canvasElement",{get:function(){if(null===this._canvasElement)throw new Error("Object is disposed");return this._canvasElement},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"canvasElementClientSize",{get:function(){return this._canvasElementClientSize},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"bitmapSize",{get:function(){return on({width:this.canvasElement.width,height:this.canvasElement.height})},enumerable:!1,configurable:!0}),t.prototype.resizeCanvasElement=function(t){this._canvasElementClientSize=on(t),this.canvasElement.style.width="".concat(this._canvasElementClientSize.width,"px"),this.canvasElement.style.height="".concat(this._canvasElementClientSize.height,"px"),this._invalidateBitmapSize()},t.prototype.subscribeBitmapSizeChanged=function(t){this._bitmapSizeChangedListeners.push(t)},t.prototype.unsubscribeBitmapSizeChanged=function(t){this._bitmapSizeChangedListeners=this._bitmapSizeChangedListeners.filter((function(i){return i!==t}))},Object.defineProperty(t.prototype,"suggestedBitmapSize",{get:function(){return this._suggestedBitmapSize},enumerable:!1,configurable:!0}),t.prototype.subscribeSuggestedBitmapSizeChanged=function(t){this._suggestedBitmapSizeChangedListeners.push(t)},t.prototype.unsubscribeSuggestedBitmapSizeChanged=function(t){this._suggestedBitmapSizeChangedListeners=this._suggestedBitmapSizeChangedListeners.filter((function(i){return i!==t}))},t.prototype.applySuggestedBitmapSize=function(){if(null!==this._suggestedBitmapSize){var t=this._suggestedBitmapSize;this._suggestedBitmapSize=null,this._resizeBitmap(t),this._emitSuggestedBitmapSizeChanged(t,this._suggestedBitmapSize)}},t.prototype._resizeBitmap=function(t){var i=this.bitmapSize;_n(i,t)||(this.canvasElement.width=t.width,this.canvasElement.height=t.height,this._emitBitmapSizeChanged(i,t))},t.prototype._emitBitmapSizeChanged=function(t,i){var n=this;this._bitmapSizeChangedListeners.forEach((function(s){return s.call(n,t,i)}))},t.prototype._suggestNewBitmapSize=function(t){var i=this._suggestedBitmapSize,n=on(this._transformBitmapSize(t,this._canvasElementClientSize)),s=_n(this.bitmapSize,n)?null:n;null===i&&null===s||null!==i&&null!==s&&_n(i,s)||(this._suggestedBitmapSize=s,this._emitSuggestedBitmapSizeChanged(i,s))},t.prototype._emitSuggestedBitmapSizeChanged=function(t,i){var n=this;this._suggestedBitmapSizeChangedListeners.forEach((function(s){return s.call(n,t,i)}))},t.prototype._chooseAndInitObserver=function(){var t=this;this._allowResizeObserver?new Promise((function(t){var i=new ResizeObserver((function(n){t(n.every((function(t){return"devicePixelContentBoxSize"in t}))),i.disconnect()}));i.observe(document.body,{box:"device-pixel-content-box"})})).catch((function(){return!1})).then((function(i){return i?t._initResizeObserver():t._initDevicePixelRatioObservable()})):this._initDevicePixelRatioObservable()},t.prototype._initDevicePixelRatioObservable=function(){var t=this;if(null!==this._canvasElement){var i=dn(this._canvasElement);if(null===i)throw new Error("No window is associated with the canvas");this._devicePixelRatioObservable=function(t){return new un(t)}(i),this._devicePixelRatioObservable.subscribe((function(){return t._invalidateBitmapSize()})),this._invalidateBitmapSize()}},t.prototype._invalidateBitmapSize=function(){var t,i;if(null!==this._canvasElement){var n=dn(this._canvasElement);if(null!==n){var s=null!==(i=null===(t=this._devicePixelRatioObservable)||void 0===t?void 0:t.value)&&void 0!==i?i:n.devicePixelRatio,e=this._canvasElement.getClientRects(),r=void 0!==e[0]?function(t,i){return on({width:Math.round(t.left*i+t.width*i)-Math.round(t.left*i),height:Math.round(t.top*i+t.height*i)-Math.round(t.top*i)})}(e[0],s):on({width:this._canvasElementClientSize.width*s,height:this._canvasElementClientSize.height*s});this._suggestNewBitmapSize(r)}}},t.prototype._initResizeObserver=function(){var t=this;null!==this._canvasElement&&(this._canvasElementResizeObserver=new ResizeObserver((function(i){var n=i.find((function(i){return i.target===t._canvasElement}));if(n&&n.devicePixelContentBoxSize&&n.devicePixelContentBoxSize[0]){var s=n.devicePixelContentBoxSize[0],e=on({width:s.inlineSize,height:s.blockSize});t._suggestNewBitmapSize(e)}})),this._canvasElementResizeObserver.observe(this._canvasElement,{box:"device-pixel-content-box"}))},t}();function dn(t){return t.ownerDocument.defaultView}var fn=function(){function t(t,i,n){if(0===i.width||0===i.height)throw new TypeError("Rendering target could only be created on a media with positive width and height");if(this._mediaSize=i,0===n.width||0===n.height)throw new TypeError("Rendering target could only be created using a bitmap with positive integer width and height");this._bitmapSize=n,this._context=t}return t.prototype.useMediaCoordinateSpace=function(t){try{return this._context.save(),this._context.setTransform(1,0,0,1,0,0),this._context.scale(this._horizontalPixelRatio,this._verticalPixelRatio),t({context:this._context,mediaSize:this._mediaSize})}finally{this._context.restore()}},t.prototype.useBitmapCoordinateSpace=function(t){try{return this._context.save(),this._context.setTransform(1,0,0,1,0,0),t({context:this._context,mediaSize:this._mediaSize,bitmapSize:this._bitmapSize,horizontalPixelRatio:this._horizontalPixelRatio,verticalPixelRatio:this._verticalPixelRatio})}finally{this._context.restore()}},Object.defineProperty(t.prototype,"_horizontalPixelRatio",{get:function(){return this._bitmapSize.width/this._mediaSize.width},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"_verticalPixelRatio",{get:function(){return this._bitmapSize.height/this._mediaSize.height},enumerable:!1,configurable:!0}),t}();function pn(t,i){var n=t.canvasElementClientSize;if(0===n.width||0===n.height)return null;var s=t.bitmapSize;if(0===s.width||0===s.height)return null;var e=t.canvasElement.getContext("2d",i);return null===e?null:new fn(e,n,s)}const vn="undefined"!=typeof window;function mn(){return!!vn&&window.navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function wn(){return!!vn&&/iPhone|iPad|iPod/.test(window.navigator.platform)}function gn(t,i){switch(t){case"custom":return void 0!==i?"custom-object":"series";case"price-line":return"custom-price-line";case"marker":return"series-marker";case"primitive":return"primitive";default:return"series"}}function Mn(t){return t+t%2}function bn(t){vn&&void 0!==window.chrome&&t.addEventListener("mousedown",(t=>{if(1===t.button)return t.preventDefault(),!1}))}class xn{constructor(t,i,n){this.Pf=0,this.kf=null,this.Tf={_t:Number.NEGATIVE_INFINITY,ut:Number.POSITIVE_INFINITY},this.Rf=0,this.Df=null,this.If={_t:Number.NEGATIVE_INFINITY,ut:Number.POSITIVE_INFINITY},this.Vf=null,this.Ef=!1,this.Bf=null,this.Af=null,this.zf=!1,this.Of=!1,this.Lf=!1,this.Nf=null,this.Ff=null,this.Wf=null,this.Hf=null,this.Uf=null,this.$f=null,this.jf=null,this.qf=0,this.Yf=!1,this.Kf=!1,this.Zf=!1,this.Gf=0,this.Xf=null,this.Jf=!wn(),this.Qf=t=>{this.tp(t)},this.ip=t=>{if(this.np(t)){const i=this.sp(t);if(++this.Rf,this.Df&&this.Rf>1){const{ep:n}=this.rp(yn(t),this.If);n<30&&!this.Lf&&this.hp(i,this.lp.ap),this.op()}}else{const i=this.sp(t);if(++this.Pf,this.kf&&this.Pf>1){const{ep:n}=this.rp(yn(t),this.Tf);n<5&&!this.Of&&this._p(i,this.lp.up),this.cp()}}},this.dp=t,this.lp=i,this.yn=n,this.fp()}m(){null!==this.Nf&&(this.Nf(),this.Nf=null),null!==this.Ff&&(this.Ff(),this.Ff=null),null!==this.Hf&&(this.Hf(),this.Hf=null),null!==this.Uf&&(this.Uf(),this.Uf=null),null!==this.$f&&(this.$f(),this.$f=null),null!==this.Wf&&(this.Wf(),this.Wf=null),this.pp(),this.cp()}vp(t){this.Hf&&this.Hf();const i=this.mp.bind(this);if(this.Hf=()=>{this.dp.removeEventListener("mousemove",i)},this.dp.addEventListener("mousemove",i),this.np(t))return;const n=this.sp(t);this._p(n,this.lp.wp),this.Jf=!0}cp(){null!==this.kf&&clearTimeout(this.kf),this.Pf=0,this.kf=null,this.Tf={_t:Number.NEGATIVE_INFINITY,ut:Number.POSITIVE_INFINITY}}op(){null!==this.Df&&clearTimeout(this.Df),this.Rf=0,this.Df=null,this.If={_t:Number.NEGATIVE_INFINITY,ut:Number.POSITIVE_INFINITY}}mp(t){if(this.Zf||null!==this.Af)return;if(this.np(t))return;const i=this.sp(t);this._p(i,this.lp.gp),this.Jf=!0}Mp(t){const i=kn(t.changedTouches,a(this.Xf));if(null===i)return;if(this.Gf=Pn(t),null!==this.jf)return;if(this.Kf)return;this.Yf=!0;const n=this.rp(yn(i),a(this.Af)),{bp:s,xp:e,ep:r}=n;if(this.zf||!(r<5)){if(!this.zf){const t=.5*s,i=e>=t&&!this.yn.Sp(),n=t>e&&!this.yn.Cp();i||n||(this.Kf=!0),this.zf=!0,this.Lf=!0,this.pp(),this.op()}if(!this.Kf){const n=this.sp(t,i);this.hp(n,this.lp.yp),Cn(t)}}}Pp(t){if(0!==t.button)return;const i=this.rp(yn(t),a(this.Bf)),{ep:n}=i;if(n>=5&&(this.Of=!0,this.cp()),this.Of){const i=this.sp(t);this._p(i,this.lp.kp)}}rp(t,i){const n=Math.abs(i._t-t._t),s=Math.abs(i.ut-t.ut);return{bp:n,xp:s,ep:n+s}}Tp(t){let i=kn(t.changedTouches,a(this.Xf));if(null===i&&0===t.touches.length&&(i=t.changedTouches[0]),null===i)return;this.Xf=null,this.Gf=Pn(t),this.pp(),this.Af=null,this.$f&&(this.$f(),this.$f=null);const n=this.sp(t,i);if(this.hp(n,this.lp.Rp),++this.Rf,this.Df&&this.Rf>1){const{ep:t}=this.rp(yn(i),this.If);t<30&&!this.Lf&&this.hp(n,this.lp.ap),this.op()}else this.Lf||(this.hp(n,this.lp.Dp),this.lp.Dp&&Cn(t));0===this.Rf&&Cn(t),0===t.touches.length&&this.Ef&&(this.Ef=!1,Cn(t))}tp(t){if(0!==t.button)return;const i=this.sp(t);if(this.Bf=null,this.Zf=!1,this.Uf&&(this.Uf(),this.Uf=null),mn()){this.dp.ownerDocument.documentElement.removeEventListener("mouseleave",this.Qf)}if(!this.np(t))if(this._p(i,this.lp.Ip),++this.Pf,this.kf&&this.Pf>1){const{ep:n}=this.rp(yn(t),this.Tf);n<5&&!this.Of&&this._p(i,this.lp.up),this.cp()}else this.Of||this._p(i,this.lp.Vp)}pp(){null!==this.Vf&&(clearTimeout(this.Vf),this.Vf=null)}Ep(t){if(null!==this.Xf)return;const i=t.changedTouches[0];this.Xf=i.identifier,this.Gf=Pn(t);const n=this.dp.ownerDocument.documentElement;this.Lf=!1,this.zf=!1,this.Kf=!1,this.Af=yn(i),this.$f&&(this.$f(),this.$f=null);{const i=this.Mp.bind(this),s=this.Tp.bind(this);this.$f=()=>{n.removeEventListener("touchmove",i),n.removeEventListener("touchend",s)},n.addEventListener("touchmove",i,{passive:!1}),n.addEventListener("touchend",s,{passive:!1}),this.pp(),this.Vf=setTimeout(this.Bp.bind(this,t),240)}const s=this.sp(t,i);this.hp(s,this.lp.Ap),this.Df||(this.Rf=0,this.Df=setTimeout(this.op.bind(this),500),this.If=yn(i))}zp(t){if(0!==t.button)return;const i=this.dp.ownerDocument.documentElement;mn()&&i.addEventListener("mouseleave",this.Qf),this.Of=!1,this.Bf=yn(t),this.Uf&&(this.Uf(),this.Uf=null);{const t=this.Pp.bind(this),n=this.tp.bind(this);this.Uf=()=>{i.removeEventListener("mousemove",t),i.removeEventListener("mouseup",n)},i.addEventListener("mousemove",t),i.addEventListener("mouseup",n)}if(this.Zf=!0,this.np(t))return;const n=this.sp(t);this._p(n,this.lp.Op),this.kf||(this.Pf=0,this.kf=setTimeout(this.cp.bind(this),500),this.Tf=yn(t))}fp(){this.dp.addEventListener("mouseenter",this.vp.bind(this)),this.dp.addEventListener("touchcancel",this.pp.bind(this));{const t=this.dp.ownerDocument,i=t=>{this.lp.Lp&&(t.composed&&this.dp.contains(t.composedPath()[0])||t.target&&this.dp.contains(t.target)||this.lp.Lp())};this.Ff=()=>{t.removeEventListener("touchstart",i)},this.Nf=()=>{t.removeEventListener("mousedown",i)},t.addEventListener("mousedown",i),t.addEventListener("touchstart",i,{passive:!0})}wn()&&(this.Wf=()=>{this.dp.removeEventListener("dblclick",this.ip)},this.dp.addEventListener("dblclick",this.ip)),this.dp.addEventListener("mouseleave",this.Np.bind(this)),this.dp.addEventListener("touchstart",this.Ep.bind(this),{passive:!0}),bn(this.dp),this.dp.addEventListener("mousedown",this.zp.bind(this)),this.Fp(),this.dp.addEventListener("touchmove",(()=>{}),{passive:!1})}Fp(){void 0===this.lp.Wp&&void 0===this.lp.Hp&&void 0===this.lp.Up||(this.dp.addEventListener("touchstart",(t=>this.$p(t.touches)),{passive:!0}),this.dp.addEventListener("touchmove",(t=>{if(2===t.touches.length&&null!==this.jf&&void 0!==this.lp.Hp){const i=Sn(t.touches[0],t.touches[1])/this.qf;this.lp.Hp(this.jf,i),Cn(t)}}),{passive:!1}),this.dp.addEventListener("touchend",(t=>{this.$p(t.touches)})))}$p(t){1===t.length&&(this.Yf=!1),2!==t.length||this.Yf||this.Ef?this.jp():this.qp(t)}qp(t){const i=this.dp.getBoundingClientRect()||{left:0,top:0};this.jf={_t:(t[0].clientX-i.left+(t[1].clientX-i.left))/2,ut:(t[0].clientY-i.top+(t[1].clientY-i.top))/2},this.qf=Sn(t[0],t[1]),void 0!==this.lp.Wp&&this.lp.Wp(),this.pp()}jp(){null!==this.jf&&(this.jf=null,void 0!==this.lp.Up&&this.lp.Up())}Np(t){if(this.Hf&&this.Hf(),this.np(t))return;if(!this.Jf)return;const i=this.sp(t);this._p(i,this.lp.Yp),this.Jf=!wn()}Bp(t){const i=kn(t.touches,a(this.Xf));if(null===i)return;const n=this.sp(t,i);this.hp(n,this.lp.Kp),this.Lf=!0,this.Ef=!0}np(t){return t.sourceCapabilities&&void 0!==t.sourceCapabilities.firesTouchEvents?t.sourceCapabilities.firesTouchEvents:Pn(t){"touchstart"!==t.type&&Cn(t)}}}}function Sn(t,i){const n=t.clientX-i.clientX,s=t.clientY-i.clientY;return Math.sqrt(n*n+s*s)}function Cn(t){t.cancelable&&t.preventDefault()}function yn(t){return{_t:t.pageX,ut:t.pageY}}function Pn(t){return t.timeStamp||performance.now()}function kn(t,i){for(let n=0;n!1,Cp:()=>!0}),this.Qp={vv:n,pv:t}}ov(){this.lv.style.background=this.sv.N().layout.panes.separatorColor}mv(t){null!==this.Qp&&(this.Qp.vv.style.backgroundColor=this.sv.N().layout.panes.separatorHoverColor)}wv(t){null!==this.Qp&&null===this.nv&&(this.Qp.vv.style.backgroundColor="")}gv(t){if(null===this.Qp)return;const i=this.ev.xv().O_()+this.hv.xv().O_(),n=i/(this.ev.cv().height+this.hv.cv().height),s=30*n;i<=2*s||(this.nv={Sv:t.pageY,Cv:this.ev.xv().O_(),yv:i-s,Pv:i,kv:n,Tv:s},this.Qp.pv.style.display="block")}Mv(t){const i=this.nv;if(null===i)return;const n=(t.pageY-i.Sv)*i.kv,s=Jt(i.Cv+n,i.Tv,i.yv);this.ev.xv().L_(s),this.hv.xv().L_(i.Pv-s),this.sv.Qt().ka()}bv(t){null!==this.nv&&null!==this.Qp&&(this.nv=null,this.Qp.pv.style.display="none")}}function Rn(t,i){return t.Rv-i.Rv}function Dn(t,i,n){const s=(t.Rv-i.Rv)/(t.wt-i.wt);return Math.sign(s)*Math.min(Math.abs(s),n)}class In{constructor(t,i,n,s){this.Dv=null,this.Iv=null,this.Vv=null,this.Ev=null,this.Bv=null,this.Av=0,this.zv=0,this.Ov=t,this.Lv=i,this.Nv=n,this.Ps=s}Fv(t,i){if(null!==this.Dv){if(this.Dv.wt===i)return void(this.Dv.Rv=t);if(Math.abs(this.Dv.Rv-t)50)return;let n=0;const s=Dn(this.Dv,this.Iv,this.Lv),e=Rn(this.Dv,this.Iv),r=[s],h=[e];if(n+=e,null!==this.Vv){const t=Dn(this.Iv,this.Vv,this.Lv);if(Math.sign(t)===Math.sign(s)){const i=Rn(this.Iv,this.Vv);if(r.push(t),h.push(i),n+=i,null!==this.Ev){const t=Dn(this.Vv,this.Ev,this.Lv);if(Math.sign(t)===Math.sign(s)){const i=Rn(this.Vv,this.Ev);r.push(t),h.push(i),n+=i}}}}let a=0;for(let t=0;t160?"dark":"light"}Gv(){return this.qv.N().layout.attributionLogo}Jv(){const t=new URL(location.href);return t.hostname?"&utm_source="+t.hostname+t.pathname:""}Yv(){this.Zv()&&(this.Kv(),this.vn=this.Gv(),this.vn&&(this.$v=this.Xv(),this.Uv=document.createElement("style"),this.Uv.innerText="a#tv-attr-logo{--fill:#131722;--stroke:#fff;position:absolute;left:10px;bottom:10px;height:19px;width:35px;margin:0;padding:0;border:0;z-index:3;}a#tv-attr-logo[data-dark]{--fill:#D1D4DC;--stroke:#131722;}",this.Hv=document.createElement("a"),this.Hv.href=`https://www.tradingview.com/?utm_medium=lwc-link&utm_campaign=lwc-chart${this.Jv()}`,this.Hv.title="Charting by TradingView",this.Hv.id="tv-attr-logo",this.Hv.target="_blank",this.Hv.innerHTML='',this.Hv.toggleAttribute("data-dark","dark"===this.$v),this.jv.appendChild(this.Uv),this.jv.appendChild(this.Hv)))}}function En(t,i){const n=a(t.ownerDocument).createElement("canvas");t.appendChild(n);const s=new cn(n,(e={options:{allowResizeObserver:!0},transform:(t,i)=>({width:Math.max(t.width,i.width),height:Math.max(t.height,i.height)})}).transform,e.options);var e;return s.resizeCanvasElement(i),s}function Bn(t){t.width=1,t.height=1,t.getContext("2d")?.clearRect(0,0,1,1)}function An(t,i,n,s){t.qh&&t.qh(i,n,s)}function zn(t,i,n,s){t.st(i,n,s)}function On(t,i,n,s){const e=t(n,s);for(const t of e){const n=t.Tt(s);null!==n&&i(n)}}function Ln(t,i){return n=>{if(!function(t){return void 0!==t.Ft}(n))return[];return(n.Ft()?.cl()??"")!==i?[]:n.Ga?.(t)??[]}}function Nn(t,i,n,s){if(!t.length)return;let e=0;const r=t[0].$t(s,!0);let h=1===i?n/2-(t[0].Hi()-r/2):t[0].Hi()-r/2-n/2;h=Math.max(0,h);for(let r=1;ru-o:_n)&&h>0){const s=1===i?-1-r:r-n,a=Math.min(s,h);for(let n=e;n{this.rm||this.yt.am().Qt().mr()},this.lm=()=>{this.rm||this.yt.am().Qt().mr()},this.yt=t,this.yn=i,this.Po=i.layout,this.wd=n,this.om="left"===s,this._m=Ln("normal",s),this.um=Ln("top",s),this.dm=Ln("bottom",s),this.lv=document.createElement("div"),this.lv.style.height="100%",this.lv.style.overflow="hidden",this.lv.style.width="25px",this.lv.style.left="0",this.lv.style.position="relative",this.fm=En(this.lv,on({width:16,height:16})),this.fm.subscribeSuggestedBitmapSizeChanged(this.hm);const e=this.fm.canvasElement;e.style.position="absolute",e.style.zIndex="1",e.style.left="0",e.style.top="0",this.pm=En(this.lv,on({width:16,height:16})),this.pm.subscribeSuggestedBitmapSizeChanged(this.lm);const r=this.pm.canvasElement;r.style.position="absolute",r.style.zIndex="2",r.style.left="0",r.style.top="0";const h={Op:this.gv.bind(this),Ap:this.gv.bind(this),kp:this.Mv.bind(this),yp:this.Mv.bind(this),Lp:this.vm.bind(this),Ip:this.bv.bind(this),Rp:this.bv.bind(this),up:this.wm.bind(this),ap:this.wm.bind(this),wp:this.gm.bind(this),Yp:this.wv.bind(this)};this.tv=new xn(this.pm.canvasElement,h,{Sp:()=>!this.yn.handleScroll.vertTouchDrag,Cp:()=>!0})}m(){this.tv.m(),this.pm.unsubscribeSuggestedBitmapSizeChanged(this.lm),Bn(this.pm.canvasElement),this.pm.dispose(),this.fm.unsubscribeSuggestedBitmapSizeChanged(this.hm),Bn(this.fm.canvasElement),this.fm.dispose(),null!==this.Ki&&this.Ki.a_().u(this),this.Ki=null}uv(){return this.lv}P(){return this.Po.fontSize}Mm(){const t=this.wd.N();return this.nm!==t.k&&(this.im.Ls(),this.nm=t.k),t}bm(){if(null===this.Ki)return 0;let t=0;const i=this.Mm(),n=a(this.fm.canvasElement.getContext("2d",{colorSpace:this.yt.am().N().layout.colorSpace}));n.save();const s=this.Ki.Bl();n.font=this.xm(),s.length>0&&(t=Math.max(this.im.Ii(n,s[0].io),this.im.Ii(n,s[s.length-1].io)));const e=this.Sm();for(let i=e.length;i--;){const s=this.im.Ii(n,e[i].ri());s>t&&(t=s)}const r=this.Ki.zt();if(null!==r&&null!==this.Qv&&(2!==(h=this.yn.crosshair).mode&&h.horzLine.visible&&h.horzLine.labelVisible)){const i=this.Ki.Tn(1,r),s=this.Ki.Tn(this.Qv.height-2,r);t=Math.max(t,this.im.Ii(n,this.Ki.Ji(Math.floor(Math.min(i,s))+.11111111111111,r)),this.im.Ii(n,this.Ki.Ji(Math.ceil(Math.max(i,s))-.11111111111111,r)))}var h;n.restore();const l=t||34;return Mn(Math.ceil(i.S+i.C+i.V+i.B+5+l))}Cm(t){null!==this.Qv&&_n(this.Qv,t)||(this.Qv=t,this.rm=!0,this.fm.resizeCanvasElement(t),this.pm.resizeCanvasElement(t),this.rm=!1,this.lv.style.width=`${t.width}px`,this.lv.style.height=`${t.height}px`)}ym(){return a(this.Qv).width}un(t){this.Ki!==t&&(null!==this.Ki&&this.Ki.a_().u(this),this.Ki=t,t.a_().i(this.po.bind(this),this))}Ft(){return this.Ki}Ls(){const t=this.yt.xv();this.yt.am().Qt().eu(t,a(this.Ft()))}Pm(t){if(null===this.Qv)return;const i={colorSpace:this.yt.am().N().layout.colorSpace};if(1!==t){this.km(),this.fm.applySuggestedBitmapSize();const t=pn(this.fm,i);null!==t&&(t.useBitmapCoordinateSpace((t=>{this.Tm(t),this.Rm(t)})),this.yt.Dm(t,this.dm),this.Im(t),this.yt.Dm(t,this._m),this.Vm(t))}this.pm.applySuggestedBitmapSize();const n=pn(this.pm,i);null!==n&&(n.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.Em(n),this.yt.Dm(n,this.um))}dv(){return this.fm.bitmapSize}fv(t,i,n,s){const e=this.dv();if(e.width>0&&e.height>0&&(t.drawImage(this.fm.canvasElement,i,n),s)){const s=this.pm.canvasElement;t.drawImage(s,i,n)}}Pt(){this.Ki?.Bl()}gv(t){if(null===this.Ki||this.Ki.Gi()||!this.yn.handleScale.axisPressedMouseMove.price)return;const i=this.yt.am().Qt(),n=this.yt.xv();this.tm=!0,i.G_(n,this.Ki,t.localY)}Mv(t){if(null===this.Ki||!this.yn.handleScale.axisPressedMouseMove.price)return;const i=this.yt.am().Qt(),n=this.yt.xv(),s=this.Ki;i.X_(n,s,t.localY)}vm(){if(null===this.Ki||!this.yn.handleScale.axisPressedMouseMove.price)return;const t=this.yt.am().Qt(),i=this.yt.xv(),n=this.Ki;this.tm&&(this.tm=!1,t.J_(i,n))}bv(t){if(null===this.Ki||!this.yn.handleScale.axisPressedMouseMove.price)return;const i=this.yt.am().Qt(),n=this.yt.xv();this.tm=!1,i.J_(n,this.Ki)}wm(t){this.yn.handleScale.axisDoubleClickReset.price&&this.Ls()}gm(t){if(null===this.Ki)return;!this.yt.am().Qt().N().handleScale.axisPressedMouseMove.price||this.Ki.je()||this.Ki.zo()||this.Bm(1)}wv(t){this.Bm(0)}Sm(){const t=[],i=null===this.Ki?void 0:this.Ki;return(n=>{for(let s=0;s{t.fillStyle=n.borderColor;const a=Math.max(1,Math.floor(h)),l=Math.floor(.5*h),o=Math.round(s.C*r);t.beginPath();for(const n of i)t.rect(Math.floor(e*r),Math.round(n.Rl*h)-l,o,a);t.fill()})),t.useMediaCoordinateSpace((({context:t})=>{t.font=this.xm(),t.fillStyle=n.textColor??this.Po.textColor,t.textAlign=this.om?"right":"left",t.textBaseline="middle";const r=this.om?Math.round(e-s.V):Math.round(e+s.C+s.V),h=i.map((i=>this.im.Di(t,i.io)));for(let n=i.length;n--;){const s=i[n];t.fillText(s.io,r,s.Rl+h[n])}}))}km(){if(null===this.Qv||null===this.Ki)return;let t=this.Qv.height/2;const i=[],n=this.Ki.Dt().slice(),s=this.yt.xv(),e=this.Mm();this.Ki===s.Gs()&&this.yt.xv().Dt().forEach((t=>{s.Zs(t)&&n.push(t)}));const r=this.Ki.Cl()[0],h=this.Ki;n.forEach((n=>{const e=n.qn(s,h);e.forEach((t=>{t.$i()&&null===t.Wi()&&(t.Ui(null),i.push(t))})),r===n&&e.length>0&&(t=e[0].Bi())}));this.Ki.N().alignLabels&&this.Am(i,e,t)}Am(t,i,n){if(null===this.Qv)return;const s=t.filter((t=>t.Bi()<=n)),e=t.filter((t=>t.Bi()>n));s.sort(((t,i)=>i.Bi()-t.Bi())),s.length&&e.length&&e.push(s[0]),e.sort(((t,i)=>t.Bi()-i.Bi()));for(const n of t){const t=Math.floor(n.$t(i)/2),s=n.Bi();s>-t&&sthis.Qv.height-t&&s{if(i.ji()){i.Tt(a(this.Ki)).st(t,n,this.im,s)}}))}Em(t){if(null===this.Qv||null===this.Ki)return;const i=this.yt.am().Qt(),n=[],s=this.yt.xv(),e=i.Rd().qn(s,this.Ki);e.length&&n.push(e);const r=this.Mm(),h=this.om?"right":"left";n.forEach((i=>{i.forEach((i=>{i.Tt(a(this.Ki)).st(t,r,this.im,h)}))}))}Bm(t){this.lv.style.cursor=1===t?"ns-resize":"default"}po(){const t=this.bm();this.sm{this.rm||null===this.Zm||this.sn().mr()},this.lm=()=>{this.rm||null===this.Zm||this.sn().mr()},this.qv=t,this.Zm=i,this.Zm.fu().i(this.Gm.bind(this),this,!0),this.Xm=document.createElement("td"),this.Xm.style.padding="0",this.Xm.style.position="relative";const n=document.createElement("div");n.style.width="100%",n.style.height="100%",n.style.position="relative",n.style.overflow="hidden",this.Jm=document.createElement("td"),this.Jm.style.padding="0",this.Qm=document.createElement("td"),this.Qm.style.padding="0",this.Xm.appendChild(n),this.fm=En(n,on({width:16,height:16})),this.fm.subscribeSuggestedBitmapSizeChanged(this.hm);const s=this.fm.canvasElement;s.style.position="absolute",s.style.zIndex="1",s.style.left="0",s.style.top="0",this.pm=En(n,on({width:16,height:16})),this.pm.subscribeSuggestedBitmapSizeChanged(this.lm);const e=this.pm.canvasElement;e.style.position="absolute",e.style.zIndex="2",e.style.left="0",e.style.top="0",this.av=document.createElement("tr"),this.av.appendChild(this.Jm),this.av.appendChild(this.Xm),this.av.appendChild(this.Qm),this.tw(),this.tv=new xn(this.pm.canvasElement,this,{Sp:()=>null===this.jm&&!this.qv.N().handleScroll.vertTouchDrag,Cp:()=>null===this.jm&&!this.qv.N().handleScroll.horzTouchDrag})}m(){null!==this.zm&&this.zm.m(),null!==this.Om&&this.Om.m(),this.Lm=null,this.pm.unsubscribeSuggestedBitmapSizeChanged(this.lm),Bn(this.pm.canvasElement),this.pm.dispose(),this.fm.unsubscribeSuggestedBitmapSizeChanged(this.hm),Bn(this.fm.canvasElement),this.fm.dispose(),null!==this.Zm&&(this.Zm.fu().u(this),this.Zm.m()),this.tv.m()}xv(){return a(this.Zm)}iw(t){null!==this.Zm&&this.Zm.fu().u(this),this.Zm=t,null!==this.Zm&&this.Zm.fu().i(jn.prototype.Gm.bind(this),this,!0),this.tw(),this.qv.rv().indexOf(this)===this.qv.rv().length-1?(this.Lm=this.Lm??new Vn(this.Xm,this.qv),this.Lm.Pt()):(this.Lm?.Kv(),this.Lm=null)}am(){return this.qv}uv(){return this.av}tw(){if(null!==this.Zm&&(this.nw(),0!==this.sn().Jn().length)){if(null!==this.zm){const t=this.Zm.K_();this.zm.un(a(t))}if(null!==this.Om){const t=this.Zm.Z_();this.Om.un(a(t))}}}sw(){null!==this.zm&&this.zm.Pt(),null!==this.Om&&this.Om.Pt()}O_(){return null!==this.Zm?this.Zm.O_():0}L_(t){this.Zm&&this.Zm.L_(t)}wp(t){if(!this.Zm)return;this.ew();const i=t.localX,n=t.localY;this.rw(i,n,t)}Op(t){this.ew(),this.hw(),this.rw(t.localX,t.localY,t)}gp(t){if(!this.Zm)return;this.ew();const i=t.localX,n=t.localY;this.rw(i,n,t)}Vp(t){null!==this.Zm&&(this.ew(),this.rw(t.localX,t.localY,t),this.aw(t))}up(t){null!==this.Zm&&this.lw(this.Hm,t)}ap(t){this.up(t)}kp(t){this.ew(),this.ow(t),this.rw(t.localX,t.localY,t)}Ip(t){null!==this.Zm&&(this.ew(),this.$m=!1,this._w(t))}Dp(t){null!==this.Zm&&this.aw(t)}Kp(t){if(this.$m=!0,null===this.jm){const i={x:t.localX,y:t.localY};this.uw(i,i,t)}}Yp(t){null!==this.Zm&&(this.ew(),this.Zm.Qt().Pd(null),this.cw())}dw(){return this.Wm}fw(){return this.Hm}Wp(){this.Um=1,this.sn().cs()}Hp(t,i){if(!this.qv.N().handleScale.pinch)return;const n=5*(i-this.Um);this.Um=i,this.sn().Ld(t._t,n)}Ap(t){this.$m=!1,this.qm=null!==this.jm,this.hw();const i=this.sn().Rd();null!==this.jm&&i.It()&&(this.Ym={x:i.ni(),y:i.si()},this.jm={x:t.localX,y:t.localY})}yp(t){if(null===this.Zm)return;const i=t.localX,n=t.localY;if(null===this.jm)this.ow(t);else{this.qm=!1;const s=a(this.Ym),e=s.x+(i-this.jm.x),r=s.y+(n-this.jm.y);this.rw(e,r,t)}}Rp(t){0===this.am().N().trackingMode.exitMode&&(this.qm=!0),this.pw(),this._w(t)}Qs(t,i){const n=this.Zm;return null===n?null:Ri(n,t,i)}mw(t,i){a("left"===i?this.zm:this.Om).Cm(on({width:t,height:this.Qv.height}))}cv(){return this.Qv}Cm(t){_n(this.Qv,t)||(this.Qv=t,this.rm=!0,this.fm.resizeCanvasElement(t),this.pm.resizeCanvasElement(t),this.rm=!1,this.Xm.style.width=t.width+"px",this.Xm.style.height=t.height+"px")}ww(){const t=a(this.Zm);t.q_(t.K_()),t.q_(t.Z_());for(const i of t.Cl())if(t.Zs(i)){const n=i.Ft();null!==n&&t.q_(n),i.Nn()}for(const i of t.vu())i.Nn()}dv(){return this.fm.bitmapSize}fv(t,i,n,s){const e=this.dv();if(e.width>0&&e.height>0&&(t.drawImage(this.fm.canvasElement,i,n),s)){const s=this.pm.canvasElement;null!==t&&t.drawImage(s,i,n)}}Pm(t){if(0===t)return;if(null===this.Zm)return;t>1&&this.ww(),null!==this.zm&&this.zm.Pm(t),null!==this.Om&&this.Om.Pm(t);const i={colorSpace:this.qv.N().layout.colorSpace};if(1!==t){this.fm.applySuggestedBitmapSize();const t=pn(this.fm,i);null!==t&&(t.useBitmapCoordinateSpace((t=>{this.Tm(t)})),this.Zm&&(this.gw(t,Wn),this.Mw(t),this.gw(t,Hn),this.gw(t,Un)))}this.pm.applySuggestedBitmapSize();const n=pn(this.pm,i);null!==n&&(n.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.bw(n),this.gw(n,$n),this.gw(n,Un))}xw(){return this.zm}Sw(){return this.Om}Dm(t,i){this.gw(t,i)}Gm(){null!==this.Zm&&this.Zm.fu().u(this),this.Zm=null}aw(t){this.lw(this.Wm,t)}lw(t,i){const n=i.localX,s=i.localY;t.v()&&t.p(this.sn().Bt().Rc(n),{x:n,y:s},i)}Tm({context:t,bitmapSize:i}){const{width:n,height:s}=i,e=this.sn(),r=e.$(),h=e.ef();r===h?E(t,0,0,n,s,h):z(t,0,0,n,s,r,h)}Mw(t){const i=a(this.Zm),n=i.pu().wr().Tt(i);null!==n&&n.st(t,!1)}bw(t){this.Cw(t,Hn,zn,this.sn().Rd())}gw(t,i){const n=a(this.Zm),s=n.au(),e=n.vu();for(const n of e)this.Cw(t,i,An,n);for(const n of s)this.Cw(t,i,An,n);for(const n of e)this.Cw(t,i,zn,n);for(const n of s)this.Cw(t,i,zn,n)}Cw(t,i,n,s){const e=a(this.Zm),r=e.Qt().ou(),h=null!==r&&r.lu===s,l=null!==r&&h&&void 0!==r.wu?r.wu.ie:void 0;On(i,(i=>n(i,t,h,l)),s,e)}nw(){if(null===this.Zm)return;const t=this.qv,i=this.Zm.K_().N().visible,n=this.Zm.Z_().N().visible;i||null===this.zm||(this.Jm.removeChild(this.zm.uv()),this.zm.m(),this.zm=null),n||null===this.Om||(this.Qm.removeChild(this.Om.uv()),this.Om.m(),this.Om=null);const s=t.Qt().Zd();i&&null===this.zm&&(this.zm=new Fn(this,t.N(),s,"left"),this.Jm.appendChild(this.zm.uv())),n&&null===this.Om&&(this.Om=new Fn(this,t.N(),s,"right"),this.Qm.appendChild(this.Om.uv()))}yw(t){return t.Zp&&this.$m||null!==this.jm}rw(t,i,n){t=Math.max(0,Math.min(t,this.Qv.width-1)),i=Math.max(0,Math.min(i,this.Qv.height-1)),this.sn().jd(t,i,n,a(this.Zm))}cw(){this.sn().Yd()}pw(){this.qm&&(this.jm=null,this.cw())}uw(t,i,n){this.jm=t,this.qm=!1,this.rw(i.x,i.y,n);const s=this.sn().Rd();this.Ym={x:s.ni(),y:s.si()}}sn(){return this.qv.Qt()}_w(t){if(!this.Fm)return;const i=this.sn(),n=this.xv();if(i.iu(n,n.kn()),this.Nm=null,this.Fm=!1,i.Hd(),null!==this.Km){const t=performance.now(),n=i.Bt();this.Km.me(n.Ac(),t),this.Km.jc(t)||i.ps(this.Km)}}ew(){this.jm=null}hw(){if(!this.Zm)return;if(this.sn().cs(),document.activeElement!==document.body&&document.activeElement!==document.documentElement)a(document.activeElement).blur();else{const t=document.getSelection();null!==t&&t.removeAllRanges()}!this.Zm.kn().Gi()&&this.sn().Bt().Gi()}ow(t){if(null===this.Zm)return;const i=this.sn(),n=i.Bt();if(n.Gi())return;const s=this.qv.N(),e=s.handleScroll,r=s.kineticScroll;if((!e.pressedMouseMove||t.Zp)&&(!e.horzTouchDrag&&!e.vertTouchDrag||!t.Zp))return;const h=this.Zm.kn(),a=performance.now();if(null!==this.Nm||this.yw(t)||(this.Nm={x:t.clientX,y:t.clientY,xf:a,Pw:t.localX,kw:t.localY}),null!==this.Nm&&!this.Fm&&(this.Nm.x!==t.clientX||this.Nm.y!==t.clientY)){if(t.Zp&&r.touch||!t.Zp&&r.mouse){const t=n.fl();this.Km=new In(.2/t,7/t,.997,15/t),this.Km.Fv(n.Ac(),this.Nm.xf)}else this.Km=null;h.Gi()||i.Q_(this.Zm,h,t.localY),i.Fd(t.localX),this.Fm=!0}this.Fm&&(h.Gi()||i.tu(this.Zm,h,t.localY),i.Wd(t.localX),null!==this.Km&&this.Km.Fv(n.Ac(),a))}}class qn{constructor(t,i,n,s,e){this.St=!0,this.Qv=on({width:0,height:0}),this.hm=()=>this.Pm(3),this.om="left"===t,this.wd=n.Zd,this.yn=i,this.Tw=s,this.Rw=e,this.lv=document.createElement("div"),this.lv.style.width="25px",this.lv.style.height="100%",this.lv.style.overflow="hidden",this.fm=En(this.lv,on({width:16,height:16})),this.fm.subscribeSuggestedBitmapSizeChanged(this.hm)}m(){this.fm.unsubscribeSuggestedBitmapSizeChanged(this.hm),Bn(this.fm.canvasElement),this.fm.dispose()}uv(){return this.lv}cv(){return this.Qv}Cm(t){_n(this.Qv,t)||(this.Qv=t,this.fm.resizeCanvasElement(t),this.lv.style.width=`${t.width}px`,this.lv.style.height=`${t.height}px`,this.St=!0)}Pm(t){if(t<3&&!this.St)return;if(0===this.Qv.width||0===this.Qv.height)return;this.St=!1,this.fm.applySuggestedBitmapSize();const i=pn(this.fm,{colorSpace:this.yn.layout.colorSpace});null!==i&&i.useBitmapCoordinateSpace((t=>{this.Tm(t),this.Rm(t)}))}dv(){return this.fm.bitmapSize}fv(t,i,n){const s=this.dv();s.width>0&&s.height>0&&t.drawImage(this.fm.canvasElement,i,n)}Rm({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(!this.Tw())return;t.fillStyle=this.yn.timeScale.borderColor;const e=Math.floor(this.wd.N().S*n),r=Math.floor(this.wd.N().S*s),h=this.om?i.width-e:0;t.fillRect(h,0,e,r)}Tm({context:t,bitmapSize:i}){E(t,0,0,i.width,i.height,this.Rw())}}function Yn(t){return i=>i.Xa?.(t)??[]}const Kn=Yn("normal"),Zn=Yn("top"),Gn=Yn("bottom");class Xn{constructor(t,i){this.Dw=null,this.Iw=null,this.M=null,this.Vw=!1,this.Qv=on({width:0,height:0}),this.Ew=new o,this.im=new it(5),this.rm=!1,this.hm=()=>{this.rm||this.qv.Qt().mr()},this.lm=()=>{this.rm||this.qv.Qt().mr()},this.qv=t,this.Su=i,this.yn=t.N().layout,this.Hv=document.createElement("tr"),this.Bw=document.createElement("td"),this.Bw.style.padding="0",this.Aw=document.createElement("td"),this.Aw.style.padding="0",this.lv=document.createElement("td"),this.lv.style.height="25px",this.lv.style.padding="0",this.zw=document.createElement("div"),this.zw.style.width="100%",this.zw.style.height="100%",this.zw.style.position="relative",this.zw.style.overflow="hidden",this.lv.appendChild(this.zw),this.fm=En(this.zw,on({width:16,height:16})),this.fm.subscribeSuggestedBitmapSizeChanged(this.hm);const n=this.fm.canvasElement;n.style.position="absolute",n.style.zIndex="1",n.style.left="0",n.style.top="0",this.pm=En(this.zw,on({width:16,height:16})),this.pm.subscribeSuggestedBitmapSizeChanged(this.lm);const s=this.pm.canvasElement;s.style.position="absolute",s.style.zIndex="2",s.style.left="0",s.style.top="0",this.Hv.appendChild(this.Bw),this.Hv.appendChild(this.lv),this.Hv.appendChild(this.Aw),this.Ow(),this.qv.Qt().z_().i(this.Ow.bind(this),this),this.tv=new xn(this.pm.canvasElement,this,{Sp:()=>!0,Cp:()=>!this.qv.N().handleScroll.horzTouchDrag})}m(){this.tv.m(),null!==this.Dw&&this.Dw.m(),null!==this.Iw&&this.Iw.m(),this.pm.unsubscribeSuggestedBitmapSizeChanged(this.lm),Bn(this.pm.canvasElement),this.pm.dispose(),this.fm.unsubscribeSuggestedBitmapSizeChanged(this.hm),Bn(this.fm.canvasElement),this.fm.dispose()}uv(){return this.Hv}Lw(){return this.Dw}Nw(){return this.Iw}Op(t){if(this.Vw)return;this.Vw=!0;const i=this.qv.Qt();!i.Bt().Gi()&&this.qv.N().handleScale.axisPressedMouseMove.time&&i.Od(t.localX)}Ap(t){this.Op(t)}Lp(){const t=this.qv.Qt();!t.Bt().Gi()&&this.Vw&&(this.Vw=!1,this.qv.N().handleScale.axisPressedMouseMove.time&&t.$d())}kp(t){const i=this.qv.Qt();!i.Bt().Gi()&&this.qv.N().handleScale.axisPressedMouseMove.time&&i.Ud(t.localX)}yp(t){this.kp(t)}Ip(){this.Vw=!1;const t=this.qv.Qt();t.Bt().Gi()&&!this.qv.N().handleScale.axisPressedMouseMove.time||t.$d()}Rp(){this.Ip()}up(){this.qv.N().handleScale.axisDoubleClickReset.time&&this.qv.Qt().ws()}ap(){this.up()}wp(){this.qv.Qt().N().handleScale.axisPressedMouseMove.time&&this.Bm(1)}Yp(){this.Bm(0)}cv(){return this.Qv}Fw(){return this.Ew}Ww(t,i,n){_n(this.Qv,t)||(this.Qv=t,this.rm=!0,this.fm.resizeCanvasElement(t),this.pm.resizeCanvasElement(t),this.rm=!1,this.lv.style.width=`${t.width}px`,this.lv.style.height=`${t.height}px`,this.Ew.p(t)),null!==this.Dw&&this.Dw.Cm(on({width:i,height:t.height})),null!==this.Iw&&this.Iw.Cm(on({width:n,height:t.height}))}Hw(){const t=this.Uw();return Math.ceil(t.S+t.C+t.P+t.A+t.I+t.$w)}Pt(){this.qv.Qt().Bt().Bl()}dv(){return this.fm.bitmapSize}fv(t,i,n,s){const e=this.dv();if(e.width>0&&e.height>0&&(t.drawImage(this.fm.canvasElement,i,n),s)){const s=this.pm.canvasElement;t.drawImage(s,i,n)}}Pm(t){if(0===t)return;const i={colorSpace:this.yn.colorSpace};if(1!==t){this.fm.applySuggestedBitmapSize();const n=pn(this.fm,i);null!==n&&(n.useBitmapCoordinateSpace((t=>{this.Tm(t),this.Rm(t),this.jw(n,Gn)})),this.Im(n),this.jw(n,Kn)),null!==this.Dw&&this.Dw.Pm(t),null!==this.Iw&&this.Iw.Pm(t)}this.pm.applySuggestedBitmapSize();const n=pn(this.pm,i);null!==n&&(n.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.qw([...this.qv.Qt().Jn(),this.qv.Qt().Rd()],n),this.jw(n,Zn))}jw(t,i){const n=this.qv.Qt().Jn();for(const s of n)On(i,(i=>An(i,t,!1,void 0)),s,void 0);for(const s of n)On(i,(i=>zn(i,t,!1,void 0)),s,void 0)}Tm({context:t,bitmapSize:i}){E(t,0,0,i.width,i.height,this.qv.Qt().ef())}Rm({context:t,bitmapSize:i,verticalPixelRatio:n}){if(this.qv.N().timeScale.borderVisible){t.fillStyle=this.Yw();const s=Math.max(1,Math.floor(this.Uw().S*n));t.fillRect(0,0,i.width,s)}}Im(t){const i=this.qv.Qt().Bt(),n=i.Bl();if(!n||0===n.length)return;const s=this.Su.maxTickMarkWeight(n),e=this.Uw(),r=i.N();r.borderVisible&&r.ticksVisible&&t.useBitmapCoordinateSpace((({context:t,horizontalPixelRatio:i,verticalPixelRatio:s})=>{t.strokeStyle=this.Yw(),t.fillStyle=this.Yw();const r=Math.max(1,Math.floor(i)),h=Math.floor(.5*i);t.beginPath();const a=Math.round(e.C*s);for(let s=n.length;s--;){const e=Math.round(n[s].coord*i);t.rect(e-h,0,r,a)}t.fill()})),t.useMediaCoordinateSpace((({context:t})=>{const i=e.S+e.C+e.A+e.P/2;t.textAlign="center",t.textBaseline="middle",t.fillStyle=this.H(),t.font=this.xm();for(const e of n)if(e.weight=s){const n=e.needAlignCoordinate?this.Kw(t,e.coord,e.label):e.coord;t.fillText(e.label,n,i)}}))}Kw(t,i,n){const s=this.im.Ii(t,n),e=s/2,r=Math.floor(i-e)+.5;return r<0?i+=Math.abs(0-r):r+s>this.Qv.width&&(i-=Math.abs(this.Qv.width-(r+s))),i}qw(t,i){const n=this.Uw();for(const s of t)for(const t of s.dn())t.Tt().st(i,n)}Yw(){return this.qv.N().timeScale.borderColor}H(){return this.yn.textColor}F(){return this.yn.fontSize}xm(){return g(this.F(),this.yn.fontFamily)}Zw(){return g(this.F(),this.yn.fontFamily,"bold")}Uw(){null===this.M&&(this.M={S:1,O:NaN,A:NaN,I:NaN,tn:NaN,C:5,P:NaN,k:"",Qi:new it,$w:0});const t=this.M,i=this.xm();if(t.k!==i){const n=this.F();t.P=n,t.k=i,t.A=3*n/12,t.I=3*n/12,t.tn=9*n/12,t.O=0,t.$w=4*n/12,t.Qi.Ls()}return this.M}Bm(t){this.lv.style.cursor=1===t?"ew-resize":"default"}Ow(){const t=this.qv.Qt(),i=t.N();i.leftPriceScale.visible||null===this.Dw||(this.Bw.removeChild(this.Dw.uv()),this.Dw.m(),this.Dw=null),i.rightPriceScale.visible||null===this.Iw||(this.Aw.removeChild(this.Iw.uv()),this.Iw.m(),this.Iw=null);const n={Zd:this.qv.Qt().Zd()},s=()=>i.leftPriceScale.borderVisible&&t.Bt().N().borderVisible,e=()=>t.ef();i.leftPriceScale.visible&&null===this.Dw&&(this.Dw=new qn("left",i,n,s,e),this.Bw.appendChild(this.Dw.uv())),i.rightPriceScale.visible&&null===this.Iw&&(this.Iw=new qn("right",i,n,s,e),this.Aw.appendChild(this.Iw.uv()))}}const Jn=!!vn&&!!navigator.userAgentData&&navigator.userAgentData.brands.some((t=>t.brand.includes("Chromium")))&&!!vn&&(navigator?.userAgentData?.platform?"Windows"===navigator.userAgentData.platform:navigator.userAgent.toLowerCase().indexOf("win")>=0);class Qn{constructor(t,i,n){var s;this.Gw=[],this.Xw=[],this.Jw=0,this.ho=0,this.C_=0,this.Qw=0,this.tg=0,this.ig=null,this.ng=!1,this.Wm=new o,this.Hm=new o,this.pd=new o,this.sg=null,this.eg=null,this.jv=t,this.yn=i,this.Su=n,this.Hv=document.createElement("div"),this.Hv.classList.add("tv-lightweight-charts"),this.Hv.style.overflow="hidden",this.Hv.style.direction="ltr",this.Hv.style.width="100%",this.Hv.style.height="100%",(s=this.Hv).style.userSelect="none",s.style.webkitUserSelect="none",s.style.msUserSelect="none",s.style.MozUserSelect="none",s.style.webkitTapHighlightColor="transparent",this.rg=document.createElement("table"),this.rg.setAttribute("cellspacing","0"),this.Hv.appendChild(this.rg),this.hg=this.ag.bind(this),ts(this.yn)&&this.lg(!0),this.sn=new Hi(this.md.bind(this),this.yn,n),this.Qt().Dd().i(this.og.bind(this),this),this._g=new Xn(this,this.Su),this.rg.appendChild(this._g.uv());const e=i.autoSize&&this.ug();let r=this.yn.width,h=this.yn.height;if(e||0===r||0===h){const i=t.getBoundingClientRect();r=r||i.width,h=h||i.height}this.cg(r,h),this.dg(),t.appendChild(this.Hv),this.fg(),this.sn.Bt().Zc().i(this.sn.ka.bind(this.sn),this),this.sn.z_().i(this.sn.ka.bind(this.sn),this)}Qt(){return this.sn}N(){return this.yn}rv(){return this.Gw}pg(){return this._g}m(){this.lg(!1),0!==this.Jw&&window.cancelAnimationFrame(this.Jw),this.sn.Dd().u(this),this.sn.Bt().Zc().u(this),this.sn.z_().u(this),this.sn.m();for(const t of this.Gw)this.rg.removeChild(t.uv()),t.dw().u(this),t.fw().u(this),t.m();this.Gw=[];for(const t of this.Xw)this.vg(t);this.Xw=[],a(this._g).m(),null!==this.Hv.parentElement&&this.Hv.parentElement.removeChild(this.Hv),this.pd.m(),this.Wm.m(),this.Hm.m(),this.mg()}cg(t,i,n=!1){if(this.ho===i&&this.C_===t)return;const s=function(t){const i=Math.floor(t.width),n=Math.floor(t.height);return on({width:i-i%2,height:n-n%2})}(on({width:t,height:i}));this.ho=s.height,this.C_=s.width;const e=this.ho+"px",r=this.C_+"px";if(this.wg()||(a(this.Hv).style.height=e,a(this.Hv).style.width=r),this.rg.style.height=e,this.rg.style.width=r,n){0!==this.Jw&&(window.cancelAnimationFrame(this.Jw),this.Jw=0),this.ng=!1;const t=Y.ys();null!==this.ig&&(t.xs(this.ig),this.ig=null),this.gg(t,performance.now())}else this.sn.ka()}Pm(t){void 0===t&&(t=Y.ys());for(let i=0;i{t.Pt()}))}bg(t){(void 0!==t.autoSize||!this.sg||void 0===t.width&&void 0===t.height)&&(t.autoSize&&!this.sg&&this.ug(),!1===t.autoSize&&null!==this.sg&&this.mg(),t.autoSize||void 0===t.width&&void 0===t.height||this.cg(t.width||this.C_,t.height||this.ho))}Sg(t,i){let n=0,s=0;const e=this.Gw[0],r=(n,s)=>{let e=0;for(let r=0;r{a("left"===i?this._g.Lw():this._g.Nw()).fv(a(t),n,s)};if(this.yn.timeScale.visible){const n=this._g.dv();if(null!==t){let r=0;this.yg()&&(h("left",r,s),r=a(e.xw()).dv().width),this._g.fv(t,r,s,i),r+=n.width,this.Pg()&&h("right",r,s)}s+=n.height}return on({width:n,height:s})}Dg(){let t=0,i=0,n=0;for(const s of this.Gw)this.yg()&&(i=Math.max(i,a(s.xw()).bm(),this.yn.leftPriceScale.minimumWidth)),this.Pg()&&(n=Math.max(n,a(s.Sw()).bm(),this.yn.rightPriceScale.minimumWidth)),t+=s.O_();i=Mn(i),n=Mn(n);const s=this.C_,e=this.ho,r=Math.max(s-i-n,0),h=1*this.Xw.length,l=this.yn.timeScale.visible;let o=l?Math.max(this._g.Hw(),this.yn.timeScale.minimumHeight):0;var _;o=(_=o)+_%2;const u=h+o,c=e{t.sw()})),3===this.ig?.ls()&&(this.ig.xs(t),this.Vg(),this.Eg(this.ig),this.Bg(this.ig,i),t=this.ig,this.ig=null)),this.Pm(t)}Bg(t,i){for(const n of t.bs())this.Ss(n,i)}Eg(t){const i=this.sn.Zn();for(let n=0;n{if(this.ng=!1,this.Jw=0,null!==this.ig){const i=this.ig;this.ig=null,this.gg(i,t);for(const n of i.bs())if(5===n.ds&&!n.Wt.jc(t)){this.Qt().ps(n.Wt);break}}})))}Vg(){this.dg()}vg(t){this.rg.removeChild(t.uv()),t.m()}dg(){const t=this.sn.Zn(),i=t.length,n=this.Gw.length;for(let t=i;t0){const t=new Tn(this,s-1,s);this.Xw.push(t),this.rg.insertBefore(t.uv(),this._g.uv())}this.rg.insertBefore(i.uv(),this._g.uv())}for(let n=0;n{const n=i.Un().Hn(t);null!==n&&e.set(i,n)}))}let r;if(null!==t){const i=this.sn.Bt().en(t)?.originalTime;void 0!==i&&(r=i)}const h=this.Qt().ou(),a=this.Lg(s),l=function(t,i){const n=null!==t&&t.lu instanceof Kt?t.lu:void 0,s=t?.wu?.te,e=void 0!==i&&-1!==i?i:void 0;return null===t||void 0===t.ee?{Ng:n,Fg:s}:{Ng:n,Fg:s,Wg:{ds:t.ee,Hg:(r=t.lu,h=t.ee,r instanceof xi?"pane-primitive":"marker"===h||"primitive"===h?"series-primitive":"series"),Ug:gn(t.ee,s),U_:n,$g:s,jg:e}};var r,h}(h,a);return{Qr:r,$n:t??void 0,qg:i??void 0,jg:-1!==a?a:void 0,Ng:l.Ng,Yg:e,Fg:l.Fg,Wg:l.Wg,Kg:n??void 0}}Lg(t){let i=-1;if(t)i=this.Gw.indexOf(t);else{const t=this.Qt().Rd().Kn();null!==t&&(i=this.Qt().Zn().indexOf(t))}return i}Ag(t,i,n,s){this.Wm.p((()=>this.Og(i,n,s,t)))}zg(t,i,n,s){this.Hm.p((()=>this.Og(i,n,s,t)))}og(t,i,n){this.kg(this.Qt().ou()?.mu??null),this.pd.p((()=>this.Og(t,i,n)))}fg(){const t=this.yn.timeScale.visible?"":"none";this._g.uv().style.display=t}yg(){return this.Gw[0].xv().K_().N().visible}Pg(){return this.Gw[0].xv().Z_().N().visible}ug(){return"ResizeObserver"in window&&(this.sg=new ResizeObserver((t=>{const i=t[t.length-1];if(!i)return;const n=i.contentRect.width,s=i.contentRect.height;this.cg(n,s,!0)})),this.sg.observe(this.jv,{box:"border-box"}),!0)}mg(){null!==this.sg&&this.sg.disconnect(),this.sg=null}}function ts(t){return Boolean(t.handleScroll.mouseWheel||t.handleScale.mouseWheel)}function is(t){return void 0===t.open&&void 0===t.value}function ns(t){return function(t){return void 0!==t.open}(t)||function(t){return void 0!==t.value}(t)}function ss(t,i,n,s){const e=n.value,r={$n:i,wt:t,Wt:[e,e,e,e],Qr:s};return void 0!==n.color&&(r.R=n.color),r}function es(t,i,n,s){const e=n.value,r={$n:i,wt:t,Wt:[e,e,e,e],Qr:s};return void 0!==n.lineColor&&(r.vt=n.lineColor),void 0!==n.topColor&&(r.ah=n.topColor),void 0!==n.bottomColor&&(r.oh=n.bottomColor),r}function rs(t,i,n,s){const e=n.value,r={$n:i,wt:t,Wt:[e,e,e,e],Qr:s};return void 0!==n.topLineColor&&(r._h=n.topLineColor),void 0!==n.bottomLineColor&&(r.uh=n.bottomLineColor),void 0!==n.topFillColor1&&(r.dh=n.topFillColor1),void 0!==n.topFillColor2&&(r.fh=n.topFillColor2),void 0!==n.bottomFillColor1&&(r.ph=n.bottomFillColor1),void 0!==n.bottomFillColor2&&(r.mh=n.bottomFillColor2),r}function hs(t,i,n,s){const e={$n:i,wt:t,Wt:[n.open,n.high,n.low,n.close],Qr:s};return void 0!==n.color&&(e.R=n.color),e}function as(t,i,n,s){const e={$n:i,wt:t,Wt:[n.open,n.high,n.low,n.close],Qr:s};return void 0!==n.color&&(e.R=n.color),void 0!==n.borderColor&&(e.Ht=n.borderColor),void 0!==n.wickColor&&(e.hh=n.wickColor),e}function ls(t,i,n,s,e){const r=h(e)(n),a=Math.max(...r),l=Math.min(...r),o=r[r.length-1],_=[o,a,l,o],{time:u,color:c,...d}=n;return{$n:i,wt:t,Wt:_,Qr:s,ue:d,R:c}}function os(t){return void 0!==t.Wt}function _s(t,i){return void 0!==i.customValues&&(t.Zg=i.customValues),t}function us(t){return(i,n,s,e,r,h)=>function(t,i){return i?i(t):is(t)}(s,h)?_s({wt:i,$n:n,Qr:e},s):_s(t(i,n,s,e,r),s)}function cs(t){return{Candlestick:us(as),Bar:us(hs),Area:us(es),Baseline:us(rs),Histogram:us(ss),Line:us(ss),Custom:us(ls)}[t]}function ds(t){return{$n:0,Gg:new Map,Oa:t}}function fs(t,i){if(void 0!==t&&0!==t.length)return{Xg:i.key(t[0].wt),Jg:i.key(t[t.length-1].wt)}}function ps(t){let i;return t.forEach((t=>{void 0===i&&(i=t.Qr)})),h(i)}class vs{constructor(t){this.Qg=new Map,this.tM=new Map,this.iM=new Map,this.nM=[],this.Su=t}m(){this.Qg.clear(),this.tM.clear(),this.iM.clear(),this.nM=[]}sM(t,i){let n=0!==this.Qg.size,s=!1;const e=this.tM.get(t);if(void 0!==e)if(1===this.tM.size)n=!1,s=!0,this.Qg.clear();else for(const i of this.nM)i.pointData.Gg.delete(t)&&(s=!0);let r=[];if(0!==i.length){const n=i.map((t=>t.time)),e=this.Su.createConverterToInternalObj(i),h=cs(t.bh()),a=t.ll(),l=t.ol();r=i.map(((i,r)=>{const o=e(i.time),_=this.Su.key(o);let u=this.Qg.get(_);void 0===u&&(u=ds(o),this.Qg.set(_,u),s=!0);const c=h(o,u.$n,i,n[r],a,l);return u.Gg.set(t,c),c}))}n&&this.eM(),this.rM(t,r);let h=-1;if(s){const t=[];this.Qg.forEach((i=>{t.push({timeWeight:0,time:i.Oa,pointData:i,originalTime:ps(i.Gg)})})),t.sort(((t,i)=>this.Su.key(t.time)-this.Su.key(i.time))),h=this.hM(t)}return this.aM(t,h,function(t,i,n){const s=fs(t,n),e=fs(i,n);if(void 0!==s&&void 0!==e)return{lM:!1,Ia:s.Jg>=e.Jg&&s.Xg>=e.Xg}}(this.tM.get(t),e,this.Su))}Jd(t){return this.sM(t,[])}oM(t,i,n){if(n&&t.Na())throw new Error("Historical updates are not supported when conflation is enabled. Conflation requires data to be processed in order.");const s=i;!function(t){void 0===t.Qr&&(t.Qr=t.time)}(s),this.Su.preprocessData(i);const e=this.Su.createConverterToInternalObj([i])(i.time),r=this.iM.get(t);if(!n&&void 0!==r&&this.Su.key(e)this.Su.key(t.time)this.Su.key(s.wt)?os(i)&&n.push(i):os(i)?n[n.length-1]=i:n.splice(-1,1),this.iM.set(t,i.wt)}_M(t,i,n){const s=this.tM.get(t);if(void 0===s)return;const e=yt(s,n,((t,i)=>t.$n{0!==i.length&&(t=Math.max(t,i[i.length-1].$n))})),t}aM(t,i,n){const s=this.dM();if(-1!==i)this.tM.forEach(((i,e)=>{s.U_.set(e,{ue:i,pM:e===t?n:void 0})})),this.tM.has(t)||s.U_.set(t,{ue:[],pM:n}),s.Bt.vM=this.nM,s.Bt.mM=i;else{const i=this.tM.get(t);s.U_.set(t,{ue:i||[],pM:n})}return s}dM(){return{U_:new Map,Bt:{kc:this.fM()}}}}function ms(t,i){t.$n=i,t.Gg.forEach((t=>{t.$n=i}))}function ws(t,i){return t._t=i-s&&t<=n+s}function Cs(t,i,n,s,e,r){const h=e-n,a=r-s;if(0===h&&0===a)return Math.hypot(t-n,i-s);const l=((t-n)*h+(i-s)*a)/(h*h+a*a),o=Math.max(0,Math.min(1,l)),_=n+h*o,u=s+a*o;return Math.hypot(t-_,i-u)}const ys=[0,0];function Ps(t,i,n){return void 0===i||i.wt!==t.wt-1?t._t-n/2:(i._t+t._t)/2}function ks(t,i,n){return void 0===i||i.wt!==t.wt+1?t._t+n/2:(t._t+i._t)/2}function Ts(t,i,n,s,e,r,h){if(null===i||i.from>=i.to||0===t.length)return null;const a=e/2+r,l=Ms(t,n-a,i.from,i.to),o=bs(t,n+a,l,i.to);if(l>=o)return null;let _=Number.POSITIVE_INFINITY;for(let a=l;ai.from?t[a-1]:void 0,u=ad)continue;h(l,ys);const f=ys[0],p=ys[1],v=Math.min(f,p),m=Math.max(f,p),w=v-r,g=m+r;if(s>=v&&s<=m)_=Math.min(_,0);else if(s>=w&&s<=g){const t=Math.min(Math.abs(s-v),Math.abs(m-s));_=Math.min(_,t)}}return Number.isFinite(_)?xs(_,0,"series-range"):null}function Rs(t,i){return t.wt0&&r=s&&(a=r-1),h>0&&h({...t,...this.ae.xa().xh(t.wt)})))}RM(){this.xM=null}yM(){const t=this.le.Bt(),i=t.N().enableConflation?t.Qc():0;i!==this.SM&&(this.gM=!0,this.SM=i),this.gM&&(this.DM(),this.gM=!1),this.MM&&(this.TM(),this.MM=!1),this.wM&&(this.IM(),this.wM=!1)}IM(){const t=this.ae.Ft(),i=this.le.Bt();if(this.RM(),i.Gi()||t.Gi())return;const n=i.Be();if(null===n)return;if(0===this.ae.Un().Th())return;const s=this.ae.zt();null!==s&&(this.xM=Is(this.bM,n,this.CM),this.VM(t,i,s.Wt),this.EM())}}class Es{constructor(t,i){this.BM=t,this.Ki=i}st(t,i,n){this.BM.draw(t,this.Ki,i,n)}}function Bs(t){switch(t){case"point":return 2;case"range":return 0;default:return 1}}class As extends Vs{constructor(t,i,n){super(t,i,!1),this.Yh=n,this.BM=this.Yh.renderer(),this.PM=new Es(this.BM,(t=>this.AM(t)))}get Ma(){return this.Yh.conflationReducer}Wa(t){return this.Yh.priceValueBuilder(t)}_l(t){return this.Yh.isWhitespace(t)}kM(t,i){const n=this.BM.hitTest?.(t,i,(t=>this.AM(t)));if(null!=n)return{ne:(s=n).distance,se:Bs(s.type),ee:"custom",mu:s.cursorStyle,te:s.objectId,ie:s.hitTestData};var s;const e=Ts(this.bM,this.xM,t,i,this.le.Bt().fl(),this.ae.N().hitTestTolerance,((t,i)=>{const n=t.zM;let s=NaN,e=NaN;if(void 0!==n&&!this.Yh.isWhitespace(n))for(const t of this.Yh.priceValueBuilder(n)){const i=this.AM(t);null!==i&&(s=Number.isNaN(s)?i:Math.min(s,i),e=Number.isNaN(e)?i:Math.max(e,i))}i[0]=s,i[1]=e}));return null===e?null:{...e,ee:"custom"}}DM(){const t=this.ae.xa();this.bM=this.ae.Ha().Eh().map((i=>({wt:i.$n,_t:NaN,...t.xh(i.$n),zM:i.ue})))}VM(t,i){i.Tc(this.bM,m(this.xM))}EM(){this.Yh.update({bars:this.bM.map(zs),barSpacing:this.le.Bt().fl(),visibleRange:this.xM,conflationFactor:this.le.Bt().Qc()},this.ae.N())}AM(t){const i=this.ae.zt();return null===i?null:this.ae.Ft().Nt(t,i.Wt)}}function zs(t){return{x:t._t,time:t.wt,originalData:t.zM,barColor:t.sh}}const Os={color:"#2196f3"},Ls=(t,i,n)=>{const s=l(n);return new As(t,i,s)};function Ns(t){const i={value:t.Wt[3],time:t.Qr};return void 0!==t.Zg&&(i.customValues=t.Zg),i}function Fs(t){const i=Ns(t);return void 0!==t.R&&(i.color=t.R),i}function Ws(t){const i=Ns(t);return void 0!==t.vt&&(i.lineColor=t.vt),void 0!==t.ah&&(i.topColor=t.ah),void 0!==t.oh&&(i.bottomColor=t.oh),i}function Hs(t){const i=Ns(t);return void 0!==t._h&&(i.topLineColor=t._h),void 0!==t.uh&&(i.bottomLineColor=t.uh),void 0!==t.dh&&(i.topFillColor1=t.dh),void 0!==t.fh&&(i.topFillColor2=t.fh),void 0!==t.ph&&(i.bottomFillColor1=t.ph),void 0!==t.mh&&(i.bottomFillColor2=t.mh),i}function Us(t){const i={open:t.Wt[0],high:t.Wt[1],low:t.Wt[2],close:t.Wt[3],time:t.Qr};return void 0!==t.Zg&&(i.customValues=t.Zg),i}function $s(t){const i=Us(t);return void 0!==t.R&&(i.color=t.R),i}function js(t){const i=Us(t),{R:n,Ht:s,hh:e}=t;return void 0!==n&&(i.color=n),void 0!==s&&(i.borderColor=s),void 0!==e&&(i.wickColor=e),i}function qs(t){return{Area:Ws,Line:Fs,Baseline:Hs,Histogram:Fs,Bar:$s,Candlestick:js,Custom:Ys}[t]}function Ys(t){const i=t.Qr;return{...t.ue,time:i}}const Ks={vertLine:{color:"#9598A1",width:1,style:3,visible:!0,labelVisible:!0,labelBackgroundColor:"#131722"},horzLine:{color:"#9598A1",width:1,style:3,visible:!0,labelVisible:!0,labelBackgroundColor:"#131722"},mode:1,doNotSnapToHiddenSeriesIndices:!1},Zs={vertLines:{color:"#D6DCDE",style:0,visible:!0},horzLines:{color:"#D6DCDE",style:0,visible:!0}},Gs={background:{type:"solid",color:"#FFFFFF"},textColor:"#191919",fontSize:12,fontFamily:w,panes:{enableResize:!0,separatorColor:"#E0E3EB",separatorHoverColor:"rgba(178, 181, 189, 0.2)"},attributionLogo:!0,colorSpace:"srgb",colorParsers:[]},Xs={autoScale:!0,mode:0,invertScale:!1,alignLabels:!0,borderVisible:!0,borderColor:"#2B2B43",entireTextOnly:!1,visible:!1,ticksVisible:!1,scaleMargins:{bottom:.1,top:.2},minimumWidth:0,ensureEdgeTickMarksVisible:!1,tickMarkDensity:2.5},Js={rightOffset:0,barSpacing:6,minBarSpacing:.5,maxBarSpacing:0,fixLeftEdge:!1,fixRightEdge:!1,lockVisibleTimeRangeOnResize:!1,rightBarStaysOnScroll:!1,borderVisible:!0,borderColor:"#2B2B43",visible:!0,timeVisible:!1,secondsVisible:!0,shiftVisibleRangeOnNewBar:!0,allowShiftVisibleRangeOnWhitespaceReplacement:!1,ticksVisible:!1,uniformDistribution:!1,minimumHeight:0,allowBoldLabels:!0,ignoreWhitespaceIndices:!1,enableConflation:!1,conflationThresholdFactor:1,precomputeConflationOnInit:!1,precomputeConflationPriority:"background"};function Qs(){return{addDefaultPane:!0,hoveredSeriesOnTop:!0,width:0,height:0,autoSize:!1,layout:Gs,crosshair:Ks,grid:Zs,overlayPriceScales:{...Xs},leftPriceScale:{...Xs,visible:!1},rightPriceScale:{...Xs,visible:!0},defaultVisiblePriceScaleId:"right",timeScale:Js,localization:{locale:vn?navigator.language:"",dateFormat:"dd MMM 'yy"},handleScroll:{mouseWheel:!0,pressedMouseMove:!0,horzTouchDrag:!0,vertTouchDrag:!0},handleScale:{axisPressedMouseMove:{time:!0,price:!0},axisDoubleClickReset:{time:!0,price:!0},mouseWheel:!0,pinch:!0},kineticScroll:{mouse:!1,touch:!0},trackingMode:{exitMode:1}}}class te{constructor(t,i,n){this.sv=t,this.OM=i,this.LM=n??0}applyOptions(t){this.sv.Qt().kd(this.OM,t,this.LM)}options(){return this.Ki().N()}width(){return q(this.OM)?this.sv.Cg(this.OM):0}setVisibleRange(t){this.setAutoScale(!1),this.Ki().qo(new dt(t.from,t.to))}getVisibleRange(){let t,i,n=this.Ki().ar();if(null===n)return null;if(this.Ki().so()){const s=this.Ki().g_(),e=Ui(s);n=ci(n,this.Ki().ro()),t=Number((Math.round(n.Je()/s)*s).toFixed(e)),i=Number((Math.round(n.Qe()/s)*s).toFixed(e))}else t=n.Je(),i=n.Qe();return{from:t,to:i}}setAutoScale(t){this.applyOptions({autoScale:t})}Ki(){return a(this.sv.Qt().Td(this.OM,this.LM)).Ft}}class ie{constructor(t,i,n,s){this.sv=t,this.yt=n,this.NM=i,this.FM=s}getHeight(){return this.yt.$t()}setHeight(t){const i=this.sv.Qt(),n=i.hf(this.yt);i.Ed(n,t)}getStretchFactor(){return this.yt.O_()}setStretchFactor(t){this.yt.L_(t),this.sv.Qt().ka()}paneIndex(){return this.sv.Qt().hf(this.yt)}moveTo(t){const i=this.paneIndex();i!==t&&(r(t>=0&&tthis.NM(t)))??[]}getHTMLElement(){const t=this.sv.rv();return t&&0!==t.length&&t[this.paneIndex()]?t[this.paneIndex()].uv():null}attachPrimitive(t){this.yt.hl(t),t.attached&&t.attached({chart:this.FM,requestUpdate:()=>this.yt.Qt().ka()})}detachPrimitive(t){this.yt.al(t)}priceScale(t){if(null===this.yt.A_(t))throw new Error(`Cannot find price scale with id: ${t}`);return new te(this.sv,t,this.paneIndex())}setPreserveEmptyPane(t){this.yt.W_(t)}preserveEmptyPane(){return this.yt.H_()}addCustomSeries(t,i={},n=0){return this.FM.addCustomSeries(t,i,n)}addSeries(t,i={}){return this.FM.addSeries(t,i,this.paneIndex())}}const ne={color:"#FF0000",price:0,lineStyle:2,lineWidth:1,lineVisible:!0,axisLabelVisible:!0,title:"",axisLabelColor:"",axisLabelTextColor:""};class se{constructor(t){this._r=t}applyOptions(t){this._r.vr(t)}options(){return this._r.N()}WM(){return this._r}}class ee{constructor(t,i,n,s,e,r){this.HM=new o,this.ae=t,this.UM=i,this.$M=n,this.Su=e,this.FM=s,this.jM=r}m(){this.HM.m()}priceFormatter(){return this.ae.tl()}priceToCoordinate(t){const i=this.ae.zt();return null===i?null:this.ae.Ft().Nt(t,i.Wt)}coordinateToPrice(t){const i=this.ae.zt();return null===i?null:this.ae.Ft().Tn(t,i.Wt)}barsInLogicalRange(t){if(null===t)return null;const i=new Bi(new Ii(t.from,t.to)).Fu(),n=this.ae.Un();if(n.Gi())return null;const s=n.Hn(i.La(),1),e=n.Hn(i.bi(),-1),r=a(n.Rh()),h=a(n.Qn());if(null!==s&&null!==e&&s.$n>e.$n)return{barsBefore:t.from-r,barsAfter:h-t.to};const l={barsBefore:null===s||s.$n===r?t.from-r:s.$n-r,barsAfter:null===e||e.$n===h?h-t.to:h-e.$n};return null!==s&&null!==e&&(l.from=s.Qr,l.to=e.Qr),l}setData(t){this.Su,this.ae.bh(),this.UM.qM(this.ae,t),this.YM("full")}update(t,i=!1){this.ae.bh(),this.UM.KM(this.ae,t,i),this.YM("update")}pop(t=1){const i=this.UM.ZM(this.ae,t);0!==i.length&&this.YM("update");const n=qs(this.seriesType());return i.map((t=>n(t)))}dataByIndex(t,i){const n=this.ae.Un().Hn(t,i);if(null===n)return null;return qs(this.seriesType())(n)}data(){const t=qs(this.seriesType());return this.ae.Un().Eh().map((i=>t(i)))}subscribeDataChanged(t){this.HM.i(t)}unsubscribeDataChanged(t){this.HM._(t)}applyOptions(t){this.ae.vr(t)}options(){return p(this.ae.N())}priceScale(){return this.$M.priceScale(this.ae.Ft().cl(),this.getPane().paneIndex())}createPriceLine(t){const i=_(p(ne),t),n=this.ae.Ea(i);return new se(n)}removePriceLine(t){this.ae.Ba(t.WM())}priceLines(){return this.ae.Aa().map((t=>new se(t)))}seriesType(){return this.ae.bh()}lastValueData(t){const i=this.ae.Ae(t);return i.ze?{noData:!0}:{noData:!1,price:i.gt,color:i.R}}attachPrimitive(t){this.ae.hl(t),t.attached&&t.attached({chart:this.FM,series:this,requestUpdate:()=>this.ae.Qt().ka(),horzScaleBehavior:this.Su})}detachPrimitive(t){this.ae.al(t),t.detached&&t.detached(),this.ae.Qt().ka()}getPane(){const t=this.ae,i=a(this.ae.Qt().Ks(t));return this.jM(i)}moveToPane(t){this.ae.Qt().nf(this.ae,t)}seriesOrder(){const t=this.ae.Qt().Ks(this.ae);return null===t?-1:t.U_().indexOf(this.ae)}setSeriesOrder(t){const i=this.ae.Qt().Ks(this.ae);null!==i&&i.du(this.ae,t)}YM(t){this.HM.v()&&this.HM.p(t)}}class re{constructor(t,i,n){this.GM=new o,this.Gu=new o,this.Ew=new o,this.sn=t,this.ia=t.Bt(),this._g=i,this.ia.Yc().i(this.XM.bind(this)),this.ia.Kc().i(this.JM.bind(this)),this._g.Fw().i(this.QM.bind(this)),this.Su=n}m(){this.ia.Yc().u(this),this.ia.Kc().u(this),this._g.Fw().u(this),this.GM.m(),this.Gu.m(),this.Ew.m()}scrollPosition(){return this.ia.Ac()}scrollToPosition(t,i){i?this.ia.$c(t,1e3):this.sn.Ms(t)}scrollToRealTime(){this.ia.Uc()}getVisibleRange(){const t=this.ia.Mc();return null===t?null:{from:t.from.originalTime,to:t.to.originalTime}}setVisibleRange(t){const i={from:this.Su.convertHorzItemToInternal(t.from),to:this.Su.convertHorzItemToInternal(t.to)},n=this.ia.Cc(i);this.sn.tf(n)}getVisibleLogicalRange(){const t=this.ia.gc();return null===t?null:{from:t.La(),to:t.bi()}}setVisibleLogicalRange(t){r(t.from<=t.to,"The from index cannot be after the to index."),this.sn.tf(t)}resetTimeScale(){this.sn.ws()}fitContent(){this.sn.Xc()}logicalToCoordinate(t){const i=this.sn.Bt();return i.Gi()?null:i.jt(t)}coordinateToLogical(t){return this.ia.Gi()?null:this.ia.Rc(t)}timeToIndex(t,i){const n=this.Su.convertHorzItemToInternal(t);return this.ia.vc(n,i)}timeToCoordinate(t){const i=this.timeToIndex(t,!1);return null===i?null:this.ia.jt(i)}coordinateToTime(t){const i=this.sn.Bt(),n=i.Rc(t),s=i.en(n);return null===s?null:s.originalTime}width(){return this._g.cv().width}height(){return this._g.cv().height}subscribeVisibleTimeRangeChange(t){this.GM.i(t)}unsubscribeVisibleTimeRangeChange(t){this.GM._(t)}subscribeVisibleLogicalRangeChange(t){this.Gu.i(t)}unsubscribeVisibleLogicalRangeChange(t){this.Gu._(t)}subscribeSizeChange(t){this.Ew.i(t)}unsubscribeSizeChange(t){this.Ew._(t)}applyOptions(t){this.ia.vr(t)}options(){return{...p(this.ia.N()),barSpacing:this.ia.fl()}}XM(){this.GM.v()&&this.GM.p(this.getVisibleRange())}JM(){this.Gu.v()&&this.Gu.p(this.getVisibleLogicalRange())}QM(t){this.Ew.p(t.width,t.height)}}function he(t){return function(t){if(f(t.handleScale)){const i=t.handleScale;t.handleScale={axisDoubleClickReset:{time:i,price:i},axisPressedMouseMove:{time:i,price:i},mouseWheel:i,pinch:i}}else if(void 0!==t.handleScale){const{axisPressedMouseMove:i,axisDoubleClickReset:n}=t.handleScale;f(i)&&(t.handleScale.axisPressedMouseMove={time:i,price:i}),f(n)&&(t.handleScale.axisDoubleClickReset={time:n,price:n})}const i=t.handleScroll;f(i)&&(t.handleScroll={horzTouchDrag:i,vertTouchDrag:i,mouseWheel:i,pressedMouseMove:i})}(t),t}class ae{constructor(t,i,n){this.tb=new Map,this.ib=new Map,this.nb=new o,this.sb=new o,this.eb=new o,this.od=new WeakMap,this.rb=new vs(i);const s=void 0===n?p(Qs()):_(p(Qs()),he(n));this.hb=i,this.sv=new Qn(t,s,i),this.sv.dw().i((t=>{this.nb.v()&&this.nb.p(this.ab(t()))}),this),this.sv.fw().i((t=>{this.sb.v()&&this.sb.p(this.ab(t()))}),this),this.sv.Dd().i((t=>{this.eb.v()&&this.eb.p(this.ab(t()))}),this);const e=this.sv.Qt();this.lb=new re(e,this.sv.pg(),this.hb)}remove(){this.sv.dw().u(this),this.sv.fw().u(this),this.sv.Dd().u(this),this.lb.m(),this.sv.m(),this.tb.clear(),this.ib.clear(),this.nb.m(),this.sb.m(),this.eb.m(),this.rb.m()}resize(t,i,n){this.autoSizeActive()||this.sv.cg(t,i,n)}addCustomSeries(t,i={},n=0){const s=(t=>({type:"Custom",isBuiltIn:!1,defaultOptions:{...Os,...t.defaultOptions()},ob:Ls,_b:t}))(l(t));return this.ub(s,i,n)}addSeries(t,i={},n=0){return this.ub(t,i,n)}removeSeries(t){const i=h(this.tb.get(t)),n=this.rb.Jd(i);this.sv.Qt().Jd(i),this.cb(n),this.tb.delete(t),this.ib.delete(i)}qM(t,i){this.cb(this.rb.sM(t,i))}KM(t,i,n){this.cb(this.rb.oM(t,i,n))}ZM(t,i){const[n,s]=this.rb.cM(t,i);return 0!==n.length&&this.cb(s),n}subscribeClick(t){this.nb.i(t)}unsubscribeClick(t){this.nb._(t)}subscribeCrosshairMove(t){this.eb.i(t)}unsubscribeCrosshairMove(t){this.eb._(t)}subscribeDblClick(t){this.sb.i(t)}unsubscribeDblClick(t){this.sb._(t)}priceScale(t,i=0){return new te(this.sv,t,i)}timeScale(){return this.lb}applyOptions(t){this.sv.vr(he(t))}options(){return this.sv.N()}takeScreenshot(t=!1,i=!1){let n,s;try{i||(n=this.sv.Qt().N().crosshair.mode,this.sv.vr({crosshair:{mode:2}})),s=this.sv.xg(t)}finally{i||void 0===n||this.sv.Qt().vr({crosshair:{mode:n}})}return s}addPane(t=!1){const i=this.sv.Qt().af();return i.W_(t),this.fb(i)}removePane(t){this.sv.Qt().Vd(t)}swapPanes(t,i){this.sv.Qt().Bd(t,i)}autoSizeActive(){return this.sv.wg()}chartElement(){return this.sv.vv()}panes(){return this.sv.Qt().Zn().map((t=>this.fb(t)))}paneSize(t=0){const i=this.sv.Rg(t);return{height:i.height,width:i.width}}setCrosshairPosition(t,i,n){const s=this.tb.get(n);if(void 0===s)return;const e=this.sv.Qt().Ks(s);null!==e&&this.sv.Qt().qd(t,i,e)}clearCrosshairPosition(){this.sv.Qt().Yd(!0)}horzBehaviour(){return this.hb}ub(i,n={},s=0){r(void 0!==i.ob),function(t){if(void 0===t||"custom"===t.type)return;const i=t;void 0!==i.minMove&&void 0===i.precision&&(i.precision=Ui(i.minMove))}(n.priceFormat),"Candlestick"===i.type&&function(t){void 0!==t.borderColor&&(t.borderUpColor=t.borderColor,t.borderDownColor=t.borderColor),void 0!==t.wickColor&&(t.wickUpColor=t.wickColor,t.wickDownColor=t.wickColor)}(n);const e=_(p(t),p(i.defaultOptions),n),h=i.ob,a=new Kt(this.sv.Qt(),i.type,e,h,i._b);this.sv.Qt().Gd(a,s);const l=new ee(a,this,this,this,this.hb,(t=>this.fb(t)));return this.tb.set(l,a),this.ib.set(a,l),l}cb(t){const i=this.sv.Qt();i.Kd(t.Bt.kc,t.Bt.vM,t.Bt.mM),t.U_.forEach(((t,i)=>i.ht(t.ue,t.pM))),i.Bt()._c(),i.Ec()}pb(t){return h(this.ib.get(t))}mb(t){return void 0!==t&&this.ib.has(t)?this.pb(t):void 0}ab(t){const i=new Map;t.Yg.forEach(((t,n)=>{const s=n.bh(),e=qs(s)(t);if("Custom"!==s)r(ns(e));else{const t=n.ol();r(!t||!1===t(e))}i.set(this.pb(n),e)}));const n=this.mb(t.Ng),s=void 0===t.Wg?void 0:{type:t.Wg.ds,sourceKind:t.Wg.Hg,objectKind:t.Wg.Ug,series:this.mb(t.Wg.U_),objectId:t.Wg.$g,paneIndex:t.Wg.jg};return{time:t.Qr,logical:t.$n,point:t.qg,paneIndex:t.jg,hoveredInfo:s,hoveredSeries:n,hoveredObjectId:t.Fg,seriesData:i,sourceEvent:t.Kg}}fb(t){let i=this.od.get(t);return i||(i=new ie(this.sv,(t=>this.pb(t)),t,this),this.od.set(t,i)),i}}function le(t){if(d(t)){const i=document.getElementById(t);return r(null!==i,`Cannot find element in DOM with id=${t}`),i}return t}function oe(t,i,n){const s=le(t),e=new ae(s,i,n);return i.setOptions(e.options()),e}function _e(t,i){return oe(t,new ln,ln.yf(i))}function ue(){return ln}function ce(t,i,n,s){return Math.hypot(n-t,s-i)}function de(t,i,n,s,e,r,h,a=0){if(0===i.length||s.from>=i.length||s.to<=0)return;const{context:l,horizontalPixelRatio:o,verticalPixelRatio:_}=t,u=i[s.from];let c=r(t,u),d=u;if(s.to-s.from<2){const i=e/2;l.beginPath();const n={_t:u._t-i,ut:u.ut},s={_t:u._t+i,ut:u.ut};l.moveTo(n._t*o,n.ut*_),l.lineTo(s._t*o,s.ut*_),h(t,c,n,s)}else{const e=a>0;let f=0;const p=(i,n)=>{if(h(t,c,d,n),l.beginPath(),c=i,d=n,e){const t=f%a;l.lineDashOffset=t,f=t}};let v=d;l.beginPath(),l.moveTo(u._t*o,u.ut*_);for(let h=s.from+1;ht+i),0)}(_);void 0!==r&&de(t,i,r,n,e,u,we,c),l&&function(t,i,n,s,e){if(s.to-s.from<=0)return;const{horizontalPixelRatio:r,verticalPixelRatio:h,context:a}=t;let l=null;const o=Math.max(1,Math.floor(r))%2/2,_=n*h+o;for(let n=s.to-1;n>=s.from;--n){const s=i[n];if(s){const i=e(t,s);i!==l&&(null!==l&&a.fill(),a.beginPath(),a.fillStyle=i,l=i);const n=Math.round(s._t*r)+o,u=s.ut*h;a.moveTo(n,u),a.arc(n,u,_,0,2*Math.PI)}}a.fill()}(t,i,l,n,u)}}class Me extends ge{bb(t,i){return i.vt}}function be(t,i,n,s,e){const r=1-e;return r*r*r*t+3*r*r*e*i+3*r*e*e*n+e*e*e*s}function xe(t,i,n,s,e){if(2===n){const[n,r]=me(s,e-1,e);return[Math.min(t._t,i._t,n._t,r._t),Math.max(t._t,i._t,n._t,r._t)]}return[Math.min(t._t,i._t),Math.max(t._t,i._t)]}function Se(t,i,n,s,e,r,h,a){switch(e){case 1:{const e=Cs(t,i,n._t,n.ut,s._t,n.ut),r=Cs(t,i,s._t,n.ut,s._t,s.ut),h=Math.min(e,r);return h<=a?h:null}case 2:{const[e,l]=me(r,h-1,h),o=function(t,i,n){let s=Number.POSITIVE_INFINITY,e=n[0];for(let r=1;r<=12;r++){const h=r/12,a={_t:be(n[0]._t,n[1]._t,n[2]._t,n[3]._t,h),ut:be(n[0].ut,n[1].ut,n[2].ut,n[3].ut,h)};s=Math.min(s,Cs(t,i,e._t,e.ut,a._t,a.ut)),e=a}return s}(t,i,[n,e,l,s]);return o<=a?o:null}default:{const e=Cs(t,i,n._t,n.ut,s._t,s.ut);return e<=a?e:null}}}class Ce extends Vs{constructor(t,i){super(t,i,!0)}VM(t,i,n){i.Tc(this.bM,m(this.xM)),t.Zo(this.bM,n,m(this.xM))}xb(t,i){return{wt:t,gt:i,_t:NaN,ut:NaN}}DM(){const t=this.ae.xa();this.bM=this.ae.Ha().Eh().map((i=>{let n;if((i.Zr??1)>1){const t=i.Wt[1],s=i.Wt[2],e=i.Wt[3];n=Math.abs(t-e)>Math.abs(s-e)?t:s}else n=i.Wt[3];return this.Sb(i.$n,n,t)}))}}class ye extends Ce{kM(t,i){const n=this.ae.N();return function(t,i,n,s,e,r,h,a=0,l=0){if(null===i||i.from>=i.to||0===t.length)return null;const o=Math.max(r/2,h??0)+l;let _=Number.POSITIVE_INFINITY;if(void 0!==h){const e=h+l,r=Ms(t,n-e,i.from,i.to),a=bs(t,n+e,r,i.to);for(let i=r;inew Pe(t,i)};function Te(t,i){return t.weight>i.weight?t:i}class Re{constructor(){this.Cb=new o,this.yb=function(t){let i=!1;return function(...n){i||(i=!0,queueMicrotask((()=>{t(...n),i=!1})))}}((()=>this.Cb.p(this.Pb))),this.Pb=0}kb(){return this.Cb}m(){this.Cb.m()}options(){return this.yn}setOptions(t){this.yn=t}preprocessData(t){}updateFormatter(t){this.yn&&(this.yn.localization=t)}createConverterToInternalObj(t){return this.yb(),t=>(t>this.Pb&&(this.Pb=t),t)}key(t){return t}cacheKey(t){return t}convertHorzItemToInternal(t){return t}formatHorzItem(t){return this.Tb(t)}formatTickmark(t){return this.Tb(t.time)}maxTickMarkWeight(t){return t.reduce(Te,t[0]).weight}fillWeightsForPoints(t,i){for(let s=i;st.toFixed(3)+"%"}},Ie={lastValueVisible:!1,priceLineVisible:!1};class Ve extends ae{constructor(t,i){const n=_(De,i||{}),s=new Re;super(t,s,n),s.setOptions(this.options()),this._initWhitespaceSeries()}addSeries(t,i={},n=0){if(t.isBuiltIn&&!1===["Area","Line"].includes(t.type))throw new Error("Yield curve only support Area and Line series");const s={...Ie,...i};return super.addSeries(t,s,n)}_initWhitespaceSeries(){const t=this.horzBehaviour(),i=this.addSeries(ke);let n;function s(s){const e=function(t,i){return{me:Math.max(0,t.startTimeRange),we:Math.max(0,t.minimumTimeRange,i||0),Rb:Math.max(1,t.baseResolution)}}(t.options().yieldCurve,s),r=(({me:t,we:i,Rb:n})=>`${t}~${i}~${n}`)(e);r!==n&&(n=r,i.setData(function({me:t,we:i,Rb:n}){return Array.from({length:Math.floor((i-t)/n)+1},((i,s)=>({time:t+s*n})))}(e)))}s(0),t.kb().i(s)}}function Ee(t,i){const n=le(t);return new Ve(n,i)}function Be(t,i){return t.weight>i.weight?t:i}class Ae{options(){return this.yn}setOptions(t){this.yn=t}preprocessData(t){}updateFormatter(t){this.yn&&(this.yn.localization=t)}createConverterToInternalObj(t){return t=>t}key(t){return t}cacheKey(t){return t}convertHorzItemToInternal(t){return t}formatHorzItem(t){return t.toFixed(this.Ds())}formatTickmark(t,i){return t.time.toFixed(this.Ds())}maxTickMarkWeight(t){return t.reduce(Be,t[0]).weight}fillWeightsForPoints(t,i){for(let s=i;s0?n:1,u=l*_,c=o===t.bitmapSize.height?o:o*_,d=(a??0)*_,f=t.context.createLinearGradient(0,u,0,c);if(f.addColorStop(0,s),null!=a){const t=Jt((d-u)/(c-u),0,1);f.addColorStop(t,e),f.addColorStop(t,r)}f.addColorStop(1,h),this.Wb=f,this.Bb=i}return this.Wb}}class Fe extends Le{constructor(){super(...arguments),this.Hb=new Ne}Vb(t,i){const n=this.rt;return this.Hb.Eb(t,{Ab:i.dh,zb:i.fh,Ob:i.ph,Lb:i.mh,Db:n.Db,Nb:n.Nb??0,Fb:n.Fb??t.bitmapSize.height})}}class We extends ge{constructor(){super(...arguments),this.Ub=new Ne}bb(t,i){const n=this.rt;return this.Ub.Eb(t,{Ab:i._h,zb:i._h,Ob:i.uh,Lb:i.uh,Db:n.Db,Nb:n.Nb??0,Fb:n.Fb??t.bitmapSize.height})}}class He extends ye{constructor(t,i){super(t,i),this.PM=new C,this.$b=new Fe,this.jb=new We,this.PM.nt([this.$b,this.jb])}Sb(t,i,n){return{...this.xb(t,i),...n.xh(t)}}EM(){const t=this.ae.zt();if(null===t)return;const i=this.ae.N(),n=this.ae.Ft().Nt(i.baseValue.price,t.Wt),s=this.le.Bt().fl();if(null===this.xM||0===this.bM.length)return;let e,r;if(i.relativeGradient){e=this.bM[this.xM.from].ut,r=this.bM[this.xM.from].ut;for(let t=this.xM.from;tr&&(r=i.ut)}}this.$b.ht({ot:this.bM,ct:i.lineWidth,Zt:i.lineStyle,gb:i.lineType,Db:n,Nb:e,Fb:r,Ib:!1,lt:this.xM,wb:s}),this.jb.ht({ot:this.bM,ct:i.lineWidth,Zt:i.lineStyle,gb:i.lineVisible?i.lineType:void 0,Mb:i.pointMarkersVisible?i.pointMarkersRadius||i.lineWidth/2+2:void 0,Db:n,Nb:e,Fb:r,lt:this.xM,wb:s})}}const Ue={type:"Baseline",isBuiltIn:!0,defaultOptions:{baseValue:{type:"price",price:0},relativeGradient:!1,topFillColor1:"rgba(38, 166, 154, 0.28)",topFillColor2:"rgba(38, 166, 154, 0.05)",topLineColor:"rgba(38, 166, 154, 1)",bottomFillColor1:"rgba(239, 83, 80, 0.05)",bottomFillColor2:"rgba(239, 83, 80, 0.28)",bottomLineColor:"rgba(239, 83, 80, 1)",lineWidth:3,lineStyle:0,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},ob:(t,i)=>new He(t,i)};class $e extends Le{constructor(){super(...arguments),this.Hb=new Ne}Vb(t,i){return this.Hb.Eb(t,{Ab:i.ah,zb:"",Ob:"",Lb:i.oh,Nb:this.rt?.Nb??0,Fb:t.bitmapSize.height})}}class je extends ye{constructor(t,i){super(t,i),this.PM=new C,this.qb=new $e,this.Yb=new Me,this.PM.nt([this.qb,this.Yb])}Sb(t,i,n){return{...this.xb(t,i),...n.xh(t)}}EM(){const t=this.ae.N();if(null===this.xM||0===this.bM.length)return;let i;if(t.relativeGradient){i=this.bM[this.xM.from].ut;for(let t=this.xM.from;tnew je(t,i)};class Ye extends y{constructor(){super(...arguments),this.qt=null,this.Kb=0,this.Zb=0}ht(t){this.qt=t}et({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){if(null===this.qt||0===this.qt.Un.length||null===this.qt.lt)return;if(this.Kb=this.Gb(i),this.Kb>=2){Math.max(1,Math.floor(i))%2!=this.Kb%2&&this.Kb--}this.Zb=this.qt.Xb?Math.min(this.Kb,Math.floor(i)):this.Kb;let s=null;const e=this.Zb<=this.Kb&&this.qt.fl>=Math.floor(1.5*i);for(let r=this.qt.lt.from;rf+v-1&&(e=f+v-1,s=e-_+1),t.fillRect(i,s,o-i,e-s+1)}const i=l+m;let s=Math.max(f,Math.round(h.i_*n)-a),e=s+_-1;e>f+v-1&&(e=f+v-1,s=e-_+1),t.fillRect(u+1,s,i-u,e-s+1)}}}Gb(t){const i=Math.floor(t);return Math.max(i,Math.floor(function(t,i){return Math.floor(.3*t*i)}(a(this.qt).fl,t)))}}class Ke extends Vs{constructor(t,i){super(t,i,!1)}kM(t,i){return Ts(this.bM,this.xM,t,i,this.le.Bt().fl(),this.ae.N().hitTestTolerance,((t,i)=>{i[0]=t.Qo,i[1]=t.t_}))}VM(t,i,n){i.Tc(this.bM,m(this.xM)),t.Xo(this.bM,n,m(this.xM))}Qb(t,i,n){return{wt:t,jr:i.Wt[0],qr:i.Wt[1],Yr:i.Wt[2],Kr:i.Wt[3],_t:NaN,Jo:NaN,Qo:NaN,t_:NaN,i_:NaN}}DM(){const t=this.ae.xa();this.bM=this.ae.Ha().Eh().map((i=>this.Sb(i.$n,i,t)))}}class Ze extends Ke{constructor(){super(...arguments),this.PM=new Ye}Sb(t,i,n){return{...this.Qb(t,i,n),...n.xh(t)}}EM(){const t=this.ae.N();this.PM.ht({Un:this.bM,fl:this.le.Bt().fl(),Jb:t.openVisible,Xb:t.thinBars,lt:this.xM})}}const Ge={type:"Bar",isBuiltIn:!0,defaultOptions:{upColor:"#26a69a",downColor:"#ef5350",openVisible:!0,thinBars:!0},ob:(t,i)=>new Ze(t,i)};class Xe extends y{constructor(){super(...arguments),this.qt=null,this.Kb=0}ht(t){this.qt=t}et(t){if(null===this.qt||0===this.qt.Un.length||null===this.qt.lt)return;const{horizontalPixelRatio:i}=t;if(this.Kb=function(t,i){if(t>=2.5&&t<=4)return Math.floor(3*i);const n=1-.2*Math.atan(Math.max(4,t)-4)/(.5*Math.PI),s=Math.floor(t*n*i),e=Math.floor(t*i),r=Math.min(s,e);return Math.max(Math.floor(i),r)}(this.qt.fl,i),this.Kb>=2){Math.floor(i)%2!=this.Kb%2&&this.Kb--}const n=this.qt.Un;this.qt.tx&&this.ix(t,n,this.qt.lt),this.qt.Mi&&this.Rm(t,n,this.qt.lt);const s=this.nx(i);(!this.qt.Mi||this.Kb>2*s)&&this.sx(t,n,this.qt.lt)}ix(t,i,n){if(null===this.qt)return;const{context:s,horizontalPixelRatio:e,verticalPixelRatio:r}=t;let h="",a=Math.min(Math.floor(e),Math.floor(this.qt.fl*e));a=Math.max(Math.floor(e),Math.min(a,this.Kb));const l=Math.floor(.5*a);let o=null;for(let t=n.from;t2*a)V(s,o,u,_-o+1,c-u+1,a);else{const t=_-o+1;s.fillRect(o,u,t,c-u+1)}l=_}}sx(t,i,n){if(null===this.qt)return;const{context:s,horizontalPixelRatio:e,verticalPixelRatio:r}=t;let h="";const a=this.nx(e);for(let t=n.from;to||s.fillRect(_,l,u-_+1,o-l+1)}}}class Je extends Ke{constructor(){super(...arguments),this.PM=new Xe}Sb(t,i,n){return{...this.Qb(t,i,n),...n.xh(t)}}EM(){const t=this.ae.N();this.PM.ht({Un:this.bM,fl:this.le.Bt().fl(),tx:t.wickVisible,Mi:t.borderVisible,lt:this.xM})}}const Qe={type:"Candlestick",isBuiltIn:!0,defaultOptions:{upColor:"#26a69a",downColor:"#ef5350",wickVisible:!0,borderVisible:!0,borderColor:"#378658",borderUpColor:"#26a69a",borderDownColor:"#ef5350",wickColor:"#737375",wickUpColor:"#26a69a",wickDownColor:"#ef5350"},ob:(t,i)=>new Je(t,i)};class tr extends y{constructor(){super(...arguments),this.qt=null,this.hx=[]}ht(t){this.qt=t,this.hx=[]}et({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){if(null===this.qt||0===this.qt.ot.length||null===this.qt.lt)return;this.hx.length||this.lx(i);const s=Math.max(1,Math.floor(n)),e=Math.round(this.qt.ox*n)-Math.floor(s/2),r=e+s;for(let i=this.qt.lt.from;is.ce?s.bi=n.La-i-1:n.La=s.bi+i+1))}let s=Math.ceil(this.qt.fl*t);for(let t=this.qt.lt.from;t0&&s<4)for(let t=this.qt.lt.from;ts&&(i._x>i.ce?i.bi-=1:i.La+=1)}}}class ir extends Ce{constructor(){super(...arguments),this.PM=new tr}kM(t,i){const n=this.ae.Ft().Nt(this.ae.N().base,a(this.ae.zt()).Wt);return null===n?null:Ts(this.bM,this.xM,t,i,this.le.Bt().fl(),this.ae.N().hitTestTolerance,((t,i)=>{i[0]=t.ut,i[1]=n}))}Sb(t,i,n){return{...this.xb(t,i),...n.xh(t)}}EM(){const t={ot:this.bM,fl:this.le.Bt().fl(),lt:this.xM,ox:this.ae.Ft().Nt(this.ae.N().base,a(this.ae.zt()).Wt)};this.PM.ht(t)}}const nr={type:"Histogram",isBuiltIn:!0,defaultOptions:{color:"#26a69a",base:0},ob:(t,i)=>new ir(t,i)};class sr{constructor(t,i){this.yt=t,this.ux=i,this.vx()}detach(){this.yt.detachPrimitive(this.ux)}getPane(){return this.yt}applyOptions(t){this.ux.vr?.(t)}vx(){this.yt.attachPrimitive(this.ux)}}const er={visible:!0,horzAlign:"center",vertAlign:"center",lines:[]},rr={color:"rgba(0, 0, 0, 0.5)",fontSize:48,fontFamily:w,fontStyle:"",text:""};class hr{constructor(t){this.mx=new Map,this.qt=t}draw(t){t.useMediaCoordinateSpace((t=>{if(!this.qt.visible)return;const{context:i,mediaSize:n}=t;let s=0;for(const t of this.qt.lines){if(0===t.text.length)continue;i.font=t.k;const e=this.wx(i,t.text);e>n.width?t.Fc=n.width/e:t.Fc=1,s+=t.lineHeight*t.Fc}let e=0;switch(this.qt.vertAlign){case"top":e=0;break;case"center":e=Math.max((n.height-s)/2,0);break;case"bottom":e=Math.max(n.height-s,0)}for(const t of this.qt.lines){i.save(),i.fillStyle=t.color;let s=0;switch(this.qt.horzAlign){case"left":i.textAlign="left",s=t.lineHeight/2;break;case"center":i.textAlign="center",s=n.width/2;break;case"right":i.textAlign="right",s=n.width-1-t.lineHeight/2}i.translate(s,e),i.textBaseline="top",i.font=t.k,i.scale(t.Fc,t.Fc),i.fillText(t.text,0,t.gx),i.restore(),e+=t.lineHeight*t.Fc}}))}wx(t,i){const n=this.Mx(t.font);let s=n.get(i);return void 0===s&&(s=t.measureText(i).width,n.set(i,s)),s}Mx(t){let i=this.mx.get(t);return void 0===i&&(i=new Map,this.mx.set(t,i)),i}}class ar{constructor(t){this.yn=or(t)}Pt(t){this.yn=or(t)}renderer(){return new hr(this.yn)}}function lr(t){return{...t,k:g(t.fontSize,t.fontFamily,t.fontStyle),lineHeight:t.lineHeight||1.2*t.fontSize,gx:0,Fc:0}}function or(t){return{...t,lines:t.lines.map(lr)}}function _r(t){return{...rr,...t}}function ur(t){return{...er,...t,lines:t.lines?.map(_r)??[]}}class cr{constructor(t){this.yn=ur(t),this.bx=[new ar(this.yn)]}updateAllViews(){this.bx.forEach((t=>t.Pt(this.yn)))}paneViews(){return this.bx}attached({requestUpdate:t}){this.xx=t}detached(){this.xx=void 0}vr(t){this.yn=ur({...this.yn,...t}),this.xx&&this.xx()}}function dr(t,i){return new sr(t,new cr(i))}const fr={alpha:1,padding:0};class pr{constructor(t){this.qt=t}draw(t){t.useMediaCoordinateSpace((t=>{const i=t.context,n=this.Sx(this.qt,t.mediaSize);n&&this.qt.Cx&&(i.globalAlpha=this.qt.alpha??1,i.drawImage(this.qt.Cx,n._t,n.ut,n.nn,n.$t))}))}Sx(t,i){const{maxHeight:n,maxWidth:s,yx:e,Px:r,padding:h}=t,a=Math.round(i.width/2),l=Math.round(i.height/2),o=h??0;let _=i.width-2*o,u=i.height-2*o;n&&(u=Math.min(u,n)),s&&(_=Math.min(_,s));const c=_/r,d=u/e,f=Math.min(c,d),p=r*f,v=e*f;return{_t:a-.5*p,ut:l-.5*v,$t:v,nn:p}}}class vr{constructor(t){this.kx=null,this.Tx=0,this.Rx=0,this.yn=t,this.M=mr(this.yn,this.kx,this.Tx,this.Rx)}Dx(t){void 0!==t.Ix&&(this.Tx=t.Ix),void 0!==t.Vx&&(this.Rx=t.Vx),void 0!==t.Ex&&(this.kx=t.Ex),this.Pt()}Bx(t){this.yn=t,this.Pt()}zOrder(){return"bottom"}Pt(){this.M=mr(this.yn,this.kx,this.Tx,this.Rx)}renderer(){return new pr(this.M)}}function mr(t,i,n,s){return{...t,Cx:i,Px:n,yx:s}}function wr(t){return{...fr,...t}}class gr{constructor(t,i){this.Ax=null,this.zx=t,this.yn=wr(i),this.bx=[new vr(this.yn)]}updateAllViews(){this.bx.forEach((t=>t.Pt()))}paneViews(){return this.bx}attached(t){const{requestUpdate:i}=t;this.Ox=i,this.Ax=new Image,this.Ax.onload=()=>{const t=this.Ax?.naturalHeight??1,i=this.Ax?.naturalWidth??1;this.bx.forEach((n=>n.Dx({Vx:t,Ix:i,Ex:this.Ax}))),this.Ox&&this.Ox()},this.Ax.src=this.zx}detached(){this.Ox=void 0,this.Ax=null}vr(t){this.yn=wr({...this.yn,...t}),this.Lx(),this.xx&&this.xx()}xx(){this.Ox&&this.Ox()}Lx(){this.bx.forEach((t=>t.Bx(this.yn)))}}function Mr(t,i,n){return new sr(t,new gr(i,n))}class br{constructor(t,i){this.ae=t,this.Jh=i,this.vx()}detach(){this.ae.detachPrimitive(this.Jh)}getSeries(){return this.ae}applyOptions(t){this.Jh&&this.Jh.vr&&this.Jh.vr(t)}vx(){this.ae.attachPrimitive(this.Jh)}}const xr={autoScale:!0,zOrder:"normal"};function Sr(t,i){return ti(Math.min(Math.max(t,12),30)*i)}function Cr(t,i){switch(t){case"arrowDown":case"arrowUp":return Sr(i,1);case"circle":return Sr(i,.8);case"square":return Sr(i,.7)}}function yr(t){return function(t){const i=Math.ceil(t);return i%2!=0?i-1:i}(Sr(t,1))}function Pr(t){return Math.max(Sr(t,.1),3)}function kr(t,i,n){return i?t:n?Math.ceil(t/2):0}function Tr(t,i,n,s){const e=(Cr("arrowUp",s)-1)/2*n.Nx,r=(ti(s/2)-1)/2*n.Nx;i.beginPath(),t?(i.moveTo(n._t-e,n.ut),i.lineTo(n._t,n.ut-e),i.lineTo(n._t+e,n.ut),i.lineTo(n._t+r,n.ut),i.lineTo(n._t+r,n.ut+e),i.lineTo(n._t-r,n.ut+e),i.lineTo(n._t-r,n.ut)):(i.moveTo(n._t-e,n.ut),i.lineTo(n._t,n.ut+e),i.lineTo(n._t+e,n.ut),i.lineTo(n._t+r,n.ut),i.lineTo(n._t+r,n.ut-e),i.lineTo(n._t-r,n.ut-e),i.lineTo(n._t-r,n.ut)),i.fill()}function Rr(t,i,n,s,e,r){const h=(Cr("arrowUp",s)-1)/2,a=(ti(s/2)-1)/2;if(e>=i-a-2&&e<=i+a+2&&r>=(t?n:n-h)-2&&r<=(t?n+h:n)+2)return!0;return(()=>{if(ei+h+3||r<(t?n-h-3:n)||r>(t?n:n+h+3))return!1;const s=Math.abs(e-i);return Math.abs(r-n)+3>=s/2})()}class Dr{constructor(){this.qt=null,this.$s=new it,this.F=-1,this.W="",this.nm="",this.Fx="normal"}ht(t){this.qt=t}js(t,i,n){this.F===t&&this.W===i||(this.F=t,this.W=i,this.nm=g(t,i),this.$s.Ls()),this.Fx=n}Qs(t,i){if(null===this.qt||null===this.qt.lt)return null;for(let n=this.qt.lt.from;n{this.et(t)}))}drawBackground(t){"aboveSeries"===this.Fx&&t.useBitmapCoordinateSpace((t=>{this.et(t)}))}et({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){if(null!==this.qt&&null!==this.qt.lt){t.textBaseline="middle",t.font=this.nm;for(let s=this.qt.lt.from;s=t&&e<=t+n&&r>=i-h&&r<=i+h}(t.ri._t,t.ri.ut,t.ri.nn,t.ri.$t,i,n))||function(t,i,n){if(0===t.Th)return!1;switch(t.Hx){case"arrowDown":return Rr(!0,t._t,t.ut,t.Th,i,n);case"arrowUp":return Rr(!1,t._t,t.ut,t.Th,i,n);case"circle":return function(t,i,n,s,e){const r=2+Cr("circle",n)/2,h=t-s,a=i-e;return Math.sqrt(h*h+a*a)<=r}(t._t,t.ut,t.Th,i,n);case"square":return function(t,i,n,s,e){const r=Cr("square",n),h=(r-1)/2,a=t-h,l=i-h;return s>=a&&s<=a+r&&e>=l&&e<=l+r}(t._t,t.ut,t.Th,i,n)}}(t,i,n)}function Er(t){return"atPriceTop"===t||"atPriceBottom"===t||"atPriceMiddle"===t}function Br(t,i,n,s,e,r,h,l){const o=function(t,i,n){if(Er(i.position)&&void 0!==i.price)return i.price;if("value"in(s=t)&&"number"==typeof s.value)return t.value;var s;if(function(t){return"open"in t&&"high"in t&&"low"in t&&"close"in t}(t)){if("inBar"===i.position)return t.close;if("aboveBar"===i.position)return n?t.low:t.high;if("belowBar"===i.position)return n?t.high:t.low}}(n,i,h.priceScale().options().invertScale);if(void 0===o)return;const _=Er(i.position),c=l.timeScale(),d=u(i.size)?Math.max(i.size,0):1,f=yr(c.options().barSpacing)*d,p=f/2;t.Th=f;switch(i.position){case"inBar":case"atPriceMiddle":return t.ut=a(h.priceToCoordinate(o)),void(void 0!==t.ri&&(t.ri.ut=t.ut+p+r+.6*e));case"aboveBar":case"atPriceTop":{const i=_?0:s.Ux;return t.ut=a(h.priceToCoordinate(o))-p-i,void 0!==t.ri&&(t.ri.ut=t.ut-p-.6*e,s.Ux+=1.2*e),void(_||(s.Ux+=f+r))}case"belowBar":case"atPriceBottom":{const i=_?0:s.$x;return t.ut=a(h.priceToCoordinate(o))+p+i,void 0!==t.ri&&(t.ri.ut=t.ut+p+r+.6*e,s.$x+=1.2*e),void(_||(s.$x+=f+r))}}}class Ar{constructor(t,i,n){this.jx=[],this.St=!0,this.qx=!0,this.Xt=new Dr,this.Te=t,this.qv=i,this.qt={ot:[],lt:null},this.yn=n}renderer(){if(!this.Te.options().visible)return null;this.St&&this.yM();const t=this.qv.options().layout;return this.Xt.js(t.fontSize,t.fontFamily,this.yn.zOrder),this.Xt.ht(this.qt),this.Xt}Yx(t){this.jx=t,this.Pt("data")}Pt(t){this.St=!0,"data"===t&&(this.qx=!0)}Kx(t){this.St=!0,this.yn=t}zOrder(){return"aboveSeries"===this.yn.zOrder?"top":this.yn.zOrder}yM(){const t=this.qv.timeScale(),i=this.jx;this.qx&&(this.qt.ot=i.map((t=>({wt:t.time,_t:0,ut:0,Th:0,Hx:t.shape,R:t.color,te:t.id,Zx:t.Zx,ri:void 0}))),this.qx=!1);const n=this.qv.options().layout;this.qt.lt=null;const s=t.getVisibleLogicalRange();if(null===s)return;const e=new Ii(Math.floor(s.from),Math.ceil(s.to));if(null===this.Te.data()[0])return;if(0===this.qt.ot.length)return;let r=NaN;const h=Pr(t.options().barSpacing),l={Ux:h,$x:h};this.qt.lt=Is(this.qt.ot,e,!0);for(let s=this.qt.lt.from;s0&&(o.ri={Wx:e.text,_t:0,ut:0,nn:0,$t:0});const _=this.Te.dataByIndex(e.time,0);null!==_&&Br(o,e,_,l,n.fontSize,h,this.Te,this.qv)}this.St=!1}}function zr(t){return{...xr,...t}}class Or{constructor(t){this.Yh=null,this.jx=[],this.Gx=[],this.Xx=null,this.Te=null,this.qv=null,this.Jx=!0,this.Qx=null,this.tS=null,this.iS=null,this.nS=!0,this.yn=zr(t)}attached(t){this.sS(),this.qv=t.chart,this.Te=t.series,this.Yh=new Ar(this.Te,a(this.qv),this.yn),this.Ox=t.requestUpdate,this.Te.subscribeDataChanged((t=>this.YM(t))),this.nS=!0,this.xx()}xx(){this.Ox&&this.Ox()}detached(){this.Te&&this.Xx&&this.Te.unsubscribeDataChanged(this.Xx),this.qv=null,this.Te=null,this.Yh=null,this.Xx=null}Yx(t){this.nS=!0,this.jx=t,this.sS(),this.Jx=!0,this.tS=null,this.xx()}eS(){return this.jx}paneViews(){return this.Yh?[this.Yh]:[]}updateAllViews(){this.rS()}hitTest(t,i){return this.Yh?this.Yh.renderer()?.Qs(t,i)??null:null}autoscaleInfo(t,i){if(this.yn.autoScale&&this.Yh){const t=this.hS();if(t)return{priceRange:null,margins:t}}return null}vr(t){this.yn=zr({...this.yn,...t}),this.xx&&this.xx()}hS(){const t=a(this.qv).timeScale().options().barSpacing;if(this.Jx||t!==this.iS){if(this.iS=t,this.jx.length>0){const i=Pr(t),n=1.5*yr(t)+2*i,s=this.aS();this.Qx={above:kr(n,s.aboveBar,s.inBar),below:kr(n,s.belowBar,s.inBar)}}else this.Qx=null;this.Jx=!1}return this.Qx}aS(){return null===this.tS&&(this.tS=this.jx.reduce(((t,i)=>(t[i.position]||(t[i.position]=!0),t)),{inBar:!1,aboveBar:!1,belowBar:!1,atPriceTop:!1,atPriceBottom:!1,atPriceMiddle:!1})),this.tS}sS(){if(!this.nS||!this.qv||!this.Te)return;const t=this.qv.timeScale(),i=this.Te?.data();if(null==t.getVisibleLogicalRange()||!this.Te||0===i.length)return void(this.Gx=[]);const n=t.timeToIndex(a(i[0].time),!0);this.Gx=this.jx.map(((i,s)=>{const e=t.timeToIndex(i.time,!0),r=e{this.jx.delete(i),this.uS()}),n),e={...t,cS:s,dS:Date.now()+n};this.jx.set(i,e)}else this.jx.set(i,{...t,cS:void 0,dS:void 0});this.uS()}_S(t){const i=this.jx.get(t);i&&void 0!==i.cS&&window.clearTimeout(i.cS),this.jx.delete(t),this.uS()}fS(){for(const[t]of this.jx)this._S(t)}pS(){const t=Date.now(),i=[];for(const[n,s]of this.jx)!s.dS||s.dS>t?i.push({time:s.time,sign:s.sign,value:s.value}):this._S(n);return i}vS(t){this.lS=t}uS(){this.lS&&this.lS()}}const Wr={positiveColor:"#22AB94",negativeColor:"#F7525F",updateVisibilityDuration:5e3};class Hr{constructor(t,i,n,s){this.qt=t,this.mS=i,this.wS=n,this.gS=s}draw(t){t.useBitmapCoordinateSpace((t=>{const i=t.context,n=Math.max(1,Math.floor(t.horizontalPixelRatio))%2/2,s=4*t.verticalPixelRatio+n;this.qt.forEach((e=>{const r=Math.round(e._t*t.horizontalPixelRatio)+n;i.beginPath();const h=this.MS(e.bS);i.fillStyle=h,i.arc(r,e.ut*t.verticalPixelRatio,s,0,2*Math.PI,!1),i.fill(),e.bS&&(i.strokeStyle=h,i.lineWidth=Math.floor(2*t.horizontalPixelRatio),i.beginPath(),i.moveTo((e._t-4.7)*t.horizontalPixelRatio+n,(e.ut-7*e.bS)*t.verticalPixelRatio),i.lineTo(e._t*t.horizontalPixelRatio+n,(e.ut-7*e.bS-7*e.bS*.5)*t.verticalPixelRatio),i.lineTo((e._t+4.7)*t.horizontalPixelRatio+n,(e.ut-7*e.bS)*t.verticalPixelRatio),i.stroke())}))}))}MS(t){return 0===t?this.mS:t>0?this.gS:this.wS}}class Ur{constructor(t,i,n){this.qt=[],this.Te=t,this.ia=i,this.yn=n}Pt(t){this.qt=t.map((t=>{const i=this.Te.priceToCoordinate(t.value);if(null===i)return null;return{_t:a(this.ia.timeToCoordinate(t.time)),ut:i,bS:t.sign}})).filter(v)}renderer(){const t=function(t,i){return function(t,i){return"Area"===i}(0,i)?t.lineColor:t.color}(this.Te.options(),this.Te.seriesType());return new Hr(this.qt,t,this.yn.negativeColor,this.yn.positiveColor)}}function $r(t,i){return"Line"===i||"Area"===i}class jr{constructor(t){this.qv=void 0,this.Te=void 0,this.bx=[],this.Su=null,this.xS=new Map,this.SS=new Fr((()=>this.xx())),this.yn={...Wr,...t}}vr(t){this.yn={...this.yn,...t},this.xx()}Yx(t){this.SS.fS();const i=this.Su;i&&t.forEach((t=>{this.SS.oS(t,i.key(t.time))}))}eS(){return this.SS.pS()}xx(){this.Ox?.()}attached(t){const{chart:i,series:n,requestUpdate:s,horzScaleBehavior:e}=t;this.qv=i,this.Te=n,this.Su=e;const r=this.Te.seriesType();if("Area"!==r&&"Line"!==r)throw new Error("UpDownMarkersPrimitive is only supported for Area and Line series types");this.bx=[new Ur(this.Te,this.qv.timeScale(),this.yn)],this.Ox=s,this.xx()}detached(){this.qv=void 0,this.Te=void 0,this.Ox=void 0}am(){return h(this.qv)}U_(){return h(this.Te)}updateAllViews(){this.bx.forEach((t=>t.Pt(this.eS())))}paneViews(){return this.bx}ht(t){if(!this.Te)throw new Error("Primitive not attached to series");const i=this.Te.seriesType();this.xS.clear();const n=this.Su;n&&t.forEach((t=>{ns(t)&&$r(0,i)&&this.xS.set(n.key(t.time),t.value)})),h(this.Te).setData(t)}Pt(t,i){if(!this.Te||!this.Su)throw new Error("Primitive not attached to series");const n=this.Te.seriesType(),s=this.Su.key(t.time);if(is(t)&&this.xS.delete(s),ns(t)&&$r(0,n)){const i=this.xS.get(s);i&&this.SS.oS({time:t.time,value:t.value,sign:qr(t.value,i)},s,this.yn.updateVisibilityDuration)}h(this.Te).update(t,i)}CS(){this.SS.fS()}}function qr(t,i){return t===i?0:t-i>0?1:-1}class Yr extends br{setData(t){return this.Jh.ht(t)}update(t,i){return this.Jh.Pt(t,i)}markers(){return this.Jh.eS()}setMarkers(t){return this.Jh.Yx(t)}clearMarkers(){return this.Jh.CS()}}function Kr(t,i={}){return new Yr(t,new jr(i))}const Zr={...t,color:"#2196f3"};function Gr(){return"5.2.0"}export{qe as AreaSeries,Ge as BarSeries,Ue as BaselineSeries,Qe as CandlestickSeries,Fi as ColorType,$ as CrosshairMode,nr as HistogramSeries,Li as LastPriceAnimationMode,ke as LineSeries,n as LineStyle,i as LineType,kt as MismatchDirection,Ni as PriceLineSource,mi as PriceScaleMode,Wi as TickMarkType,Oi as TrackingModeExitMode,_e as createChart,oe as createChartEx,Mr as createImageWatermark,ze as createOptionsChart,Nr as createSeriesMarkers,dr as createTextWatermark,Kr as createUpDownMarkers,Ee as createYieldCurveChart,Zr as customSeriesDefaultOptions,ue as defaultHorzScaleBehavior,$i as isBusinessDay,ji as isUTCTimestamp,Gr as version}; diff --git a/website_bkp/scripts/modules/lightweight-charts/5.2.0/dist/typings.d.ts b/website_bkp/scripts/modules/lightweight-charts/5.2.0/dist/typings.d.ts new file mode 100644 index 000000000..8a27894f9 --- /dev/null +++ b/website_bkp/scripts/modules/lightweight-charts/5.2.0/dist/typings.d.ts @@ -0,0 +1,5041 @@ +// Generated by dts-bundle-generator v9.5.1 + +import { CanvasRenderingTarget2D } from 'fancy-canvas'; + +declare const areaSeries: SeriesDefinition<"Area">; +declare const barSeries: SeriesDefinition<"Bar">; +declare const baselineSeries: SeriesDefinition<"Baseline">; +declare const candlestickSeries: SeriesDefinition<"Candlestick">; +declare const histogramSeries: SeriesDefinition<"Histogram">; +declare const lineSeries: SeriesDefinition<"Line">; +export declare const customSeriesDefaultOptions: CustomSeriesOptions; +/** + * Enumeration representing the sign of a marker. + */ +export declare const enum MarkerSign { + /** Represents a negative change (-1) */ + Negative = -1, + /** Represents no change (0) */ + Neutral = 0, + /** Represents a positive change (1) */ + Positive = 1 +} +/** + * Represents a type of color. + */ +export declare enum ColorType { + /** Solid color */ + Solid = "solid", + /** Vertical gradient color */ + VerticalGradient = "gradient" +} +/** + * Represents the crosshair mode. + */ +export declare enum CrosshairMode { + /** + * This mode allows crosshair to move freely on the chart. + */ + Normal = 0, + /** + * This mode sticks crosshair's horizontal line to the price value of a single-value series or to the close price of OHLC-based series. + */ + Magnet = 1, + /** + * This mode disables rendering of the crosshair. + */ + Hidden = 2, + /** + * This mode sticks crosshair's horizontal line to the price value of a single-value series or to the open/high/low/close price of OHLC-based series. + */ + MagnetOHLC = 3 +} +/** + * Represents the type of the last price animation for series such as area or line. + */ +export declare enum LastPriceAnimationMode { + /** + * Animation is always disabled + */ + Disabled = 0, + /** + * Animation is always enabled. + */ + Continuous = 1, + /** + * Animation is active after new data. + */ + OnDataUpdate = 2 +} +/** + * Represents the possible line styles. + */ +export declare enum LineStyle { + /** + * A solid line. + */ + Solid = 0, + /** + * A dotted line. + */ + Dotted = 1, + /** + * A dashed line. + */ + Dashed = 2, + /** + * A dashed line with bigger dashes. + */ + LargeDashed = 3, + /** + * A dotted line with more space between dots. + */ + SparseDotted = 4 +} +/** + * Represents the possible line types. + */ +export declare enum LineType { + /** + * A line. + */ + Simple = 0, + /** + * A stepped line. + */ + WithSteps = 1, + /** + * A curved line. + */ + Curved = 2 +} +/** + * Search direction if no data found at provided index + */ +export declare enum MismatchDirection { + /** + * Search the nearest left item + */ + NearestLeft = -1, + /** + * Do not search + */ + None = 0, + /** + * Search the nearest right item + */ + NearestRight = 1 +} +/** + * Represents the source of data to be used for the horizontal price line. + */ +export declare enum PriceLineSource { + /** + * Use the last bar data. + */ + LastBar = 0, + /** + * Use the last visible data of the chart viewport. + */ + LastVisible = 1 +} +/** + * Represents the price scale mode. + */ +export declare enum PriceScaleMode { + /** + * Price scale shows prices. Price range changes linearly. + */ + Normal = 0, + /** + * Price scale shows prices. Price range changes logarithmically. + */ + Logarithmic = 1, + /** + * Price scale shows percentage values according the first visible value of the price scale. + * The first visible value is 0% in this mode. + */ + Percentage = 2, + /** + * The same as percentage mode, but the first value is moved to 100. + */ + IndexedTo100 = 3 +} +/** + * Represents the type of a tick mark on the time axis. + */ +export declare enum TickMarkType { + /** + * The start of the year (e.g. it's the first tick mark in a year). + */ + Year = 0, + /** + * The start of the month (e.g. it's the first tick mark in a month). + */ + Month = 1, + /** + * A day of the month. + */ + DayOfMonth = 2, + /** + * A time without seconds. + */ + Time = 3, + /** + * A time with seconds. + */ + TimeWithSeconds = 4 +} +/** + * Determine how to exit the tracking mode. + * + * By default, mobile users will long press to deactivate the scroll and have the ability to check values and dates. + * Another press is required to activate the scroll, be able to move left/right, zoom, etc. + */ +export declare enum TrackingModeExitMode { + /** + * Tracking Mode will be deactivated on touch end event. + */ + OnTouchEnd = 0, + /** + * Tracking Mode will be deactivated on the next tap event. + */ + OnNextTap = 1 +} +/** + * This function is the simplified main entry point of the Lightweight Charting Library with time points for the horizontal scale. + * + * @param container - ID of HTML element or element itself + * @param options - Any subset of options to be applied at start. + * @returns An interface to the created chart + */ +export declare function createChart(container: string | HTMLElement, options?: DeepPartial): IChartApi; +/** + * This function is the main entry point of the Lightweight Charting Library. If you are using time values + * for the horizontal scale then it is recommended that you rather use the {@link createChart} function. + * + * @template HorzScaleItem - type of points on the horizontal scale + * @template THorzScaleBehavior - type of horizontal axis strategy that encapsulate all the specific behaviors of the horizontal scale type + * + * @param container - ID of HTML element or element itself + * @param horzScaleBehavior - Horizontal scale behavior + * @param options - Any subset of options to be applied at start. + * @returns An interface to the created chart + */ +export declare function createChartEx>(container: string | HTMLElement, horzScaleBehavior: THorzScaleBehavior, options?: DeepPartial>): IChartApiBase; +/** + * Creates an image watermark. + * + * @param pane - Target pane. + * @param imageUrl - Image URL. + * @param options - Watermark options. + * + * @returns Image watermark wrapper. + * + * @example + * ```js + * import { createImageWatermark } from 'lightweight-charts'; + * + * const firstPane = chart.panes()[0]; + * const imageWatermark = createImageWatermark(firstPane, '/images/my-image.png', { + * alpha: 0.5, + * padding: 20, + * }); + * // to change options + * imageWatermark.applyOptions({ padding: 10 }); + * // to remove watermark from the pane + * imageWatermark.detach(); + * ``` + */ +export declare function createImageWatermark(pane: IPaneApi, imageUrl: string, options: DeepPartial): IImageWatermarkPluginApi; +/** + * Creates an 'options' chart with price values on the horizontal scale. + * + * This function is used to create a specialized chart type where the horizontal scale + * represents price values instead of time. It's particularly useful for visualizing + * option chains, price distributions, or any data where price is the primary x-axis metric. + * + * @param container - The DOM element or its id where the chart will be rendered. + * @param options - Optional configuration options for the price chart. + * @returns An instance of IChartApiBase configured for price-based horizontal scaling. + */ +export declare function createOptionsChart(container: string | HTMLElement, options?: DeepPartial): IChartApiBase; +/** + * A function to create a series markers primitive. + * + * @param series - The series to which the primitive will be attached. + * + * @param markers - An array of markers to be displayed on the series. + * + * @param options - Options for the series markers plugin. + * + * @example + * ```js + * import { createSeriesMarkers } from 'lightweight-charts'; + * + * const seriesMarkers = createSeriesMarkers( + * series, + * [ + * { + * color: 'green', + * position: 'inBar', + * shape: 'arrowDown', + * time: 1556880900, + * }, + * ] + * ); + * // and then you can modify the markers + * // set it to empty array to remove all markers + * seriesMarkers.setMarkers([]); + * + * // `seriesMarkers.markers()` returns current markers + * ``` + */ +export declare function createSeriesMarkers(series: ISeriesApi, markers?: SeriesMarker[], options?: DeepPartial): ISeriesMarkersPluginApi; +/** + * Creates an image watermark. + * + * @param pane - Target pane. + * @param options - Watermark options. + * + * @returns Image watermark wrapper. + * + * @example + * ```js + * import { createTextWatermark } from 'lightweight-charts'; + * + * const firstPane = chart.panes()[0]; + * const textWatermark = createTextWatermark(firstPane, { + * horzAlign: 'center', + * vertAlign: 'center', + * lines: [ + * { + * text: 'Hello', + * color: 'rgba(255,0,0,0.5)', + * fontSize: 100, + * fontStyle: 'bold', + * }, + * { + * text: 'This is a text watermark', + * color: 'rgba(0,0,255,0.5)', + * fontSize: 50, + * fontStyle: 'italic', + * fontFamily: 'monospace', + * }, + * ], + * }); + * // to change options + * textWatermark.applyOptions({ horzAlign: 'left' }); + * // to remove watermark from the pane + * textWatermark.detach(); + * ``` + */ +export declare function createTextWatermark(pane: IPaneApi, options: DeepPartial): ITextWatermarkPluginApi; +/** + * Creates and attaches the Series Up Down Markers Plugin. + * + * @param series - Series to which attach the Up Down Markers Plugin + * @param options - options for the Up Down Markers Plugin + * + * @returns Api for Series Up Down Marker Plugin. {@link ISeriesUpDownMarkerPluginApi} + * + * @example + * ```js + * import { createUpDownMarkers, createChart, LineSeries } from 'lightweight-charts'; + * + * const chart = createChart('container'); + * const lineSeries = chart.addSeries(LineSeries); + * const upDownMarkers = createUpDownMarkers(lineSeries, { + * positiveColor: '#22AB94', + * negativeColor: '#F7525F', + * updateVisibilityDuration: 5000, + * }); + * // to add some data + * upDownMarkers.setData( + * [ + * { time: '2020-02-02', value: 12.34 }, + * //... more line series data + * ] + * ); + * // ... Update some values + * upDownMarkers.update({ time: '2020-02-02', value: 13.54 }, true); + * // to remove plugin from the series + * upDownMarkers.detach(); + * ``` + */ +export declare function createUpDownMarkers(series: ISeriesApi, options?: Partial): ISeriesUpDownMarkerPluginApi; +/** + * Creates a yield curve chart with the specified options. + * + * A yield curve chart differs from the default chart type + * in the following ways: + * - Horizontal scale is linearly spaced, and defined in monthly + * time duration units + * - Whitespace is ignored for the crosshair and grid lines + * + * @param container - ID of HTML element or element itself + * @param options - The yield chart options. + * @returns An interface to the created chart + */ +export declare function createYieldCurveChart(container: string | HTMLElement, options?: DeepPartial): IYieldCurveChartApi; +/** + * Provides the default implementation of the horizontal scale (time-based) that can be used as a base for extending the horizontal scale with custom behavior. + * This allows for the introduction of custom functionality without re-implementing the entire {@link IHorzScaleBehavior}<{@link Time}> interface. + * + * For further details, refer to the {@link createChartEx} chart constructor method. + * + * @returns An uninitialized class implementing the {@link IHorzScaleBehavior}<{@link Time}> interface + */ +export declare function defaultHorzScaleBehavior(): new () => IHorzScaleBehavior