diff options
author | Theodore Aptekarev <aptekarev@gmail.com> | 2024-05-21 14:51:00 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-21 14:51:00 +0200 |
commit | c4de0a8f3656798d4884e4b92ae97639c1ce5bee (patch) | |
tree | e551d391fa9f7d277082ce12f1cbec9b41bc96e7 | |
parent | 1994b34866eb621d92d6a88f75bcf9845d3dbce4 (diff) |
Remove xlsx export from CLI's interactive tables (#6439)
* Remove excel export from cli interactive tables code
* Remove vulnerable dependency
* Remove posthog from interactive table html template
* Incorporate additional styles to the index.css
* Update the deploy command
* Update the built static file and deploy script
---------
Co-authored-by: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com>
-rw-r--r-- | frontend-components/plotly/package.json | 2 | ||||
-rw-r--r-- | frontend-components/tables/index.html | 47 | ||||
-rw-r--r-- | frontend-components/tables/package-lock.json | 95 | ||||
-rw-r--r-- | frontend-components/tables/package.json | 3 | ||||
-rw-r--r-- | frontend-components/tables/src/components/Table/Export.tsx | 3 | ||||
-rw-r--r-- | frontend-components/tables/src/components/Table/index.tsx | 2 | ||||
-rw-r--r-- | frontend-components/tables/src/index.css | 24 | ||||
-rw-r--r-- | frontend-components/tables/src/utils/utils.ts | 17 | ||||
-rw-r--r-- | openbb_platform/obbject_extensions/charting/openbb_charting/core/table.html | 260 |
9 files changed, 69 insertions, 384 deletions
diff --git a/frontend-components/plotly/package.json b/frontend-components/plotly/package.json index e53b657b8c5..88da60690fd 100644 --- a/frontend-components/plotly/package.json +++ b/frontend-components/plotly/package.json @@ -6,7 +6,7 @@ "dev": "vite", "build": "vite build", "build_tsc": "tsc && vite build", - "deploy": "npm run build && mv dist/index.html ../../cli/openbb_cli/assets/interactive/plotly.html", + "deploy": "npm run build && mv dist/index.html ../../openbb_platform/obbject_extensions/charting/openbb_charting/core/plotly.html", "preview": "vite preview" }, "dependencies": { diff --git a/frontend-components/tables/index.html b/frontend-components/tables/index.html index 0649b65fc0b..a0d02f39ceb 100644 --- a/frontend-components/tables/index.html +++ b/frontend-components/tables/index.html @@ -5,53 +5,6 @@ <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>OpenBB Interactive Tables</title> <script> - if (window.json_data && JSON.parse(window.json_data)?.posthog?.collect_logs) { - !function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.async=!0,p.src=s.api_host+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="capture identify alias people.set people.set_once set_config register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled onFeatureFlags".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]); - posthog.init("phc_vhssDAMod5qIplznQ75Kdgz4aB1qPFmeVmfEOZ4hkRw", { - api_host: "https://app.posthog.com", - autocapture: { - css_selector_allowlist: [".ph-capture"], - }, - capture_pageview: false, - loaded: function (posthog) { - if (window.json_data) { - const data = JSON.parse(window.json_data); - - const log_id = data?.log_id || ""; - if (log_id != "" && log_id != "REPLACE_ME") { - posthog.identify(log_id); - } - - posthog.capture("table", { - INFO: { - command: data.command_location, - title: data.title, - python_version: data.python_version, - pywry_version: data.pywry_version, - terminal_version: data.terminal_version, - }, - }); - } - posthog.onFeatureFlags(function () { - if ( - !posthog.isFeatureEnabled("record-pywry", { send_event: false }) - ) { - posthog.stopSessionRecording(); - } - if ( - !posthog.isFeatureEnabled("collect-logs-pywry", { - send_event: false, - }) - ) { - posthog.opt_out_capturing(); - } else if (posthog.has_opted_out_capturing()) { - posthog.opt_in_capturing(); - } - }); - }, - }); - } - if ( // check if user had saved dark as their // theme when accessing page before diff --git a/frontend-components/tables/package-lock.json b/frontend-components/tables/package-lock.json index 09ab7da95de..2eb53da6ca2 100644 --- a/frontend-components/tables/package-lock.json +++ b/frontend-components/tables/package-lock.json @@ -27,7 +27,6 @@ "react-plotly.js": "^2.6.0", "react-table": "^7.8.0", "react-virtual": "^2.10.4", - "xlsx": "^0.18.5", "xss": "^1.0.14" }, "devDependencies": { @@ -2020,14 +2019,6 @@ "node": ">=0.4.0" } }, - "node_modules/adler-32": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", - "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", - "engines": { - "node": ">=0.8" - } - }, "node_modules/almost-equal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/almost-equal/-/almost-equal-1.1.0.tgz", @@ -2288,18 +2279,6 @@ "element-size": "^1.1.1" } }, - "node_modules/cfb": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz", - "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", - "dependencies": { - "adler-32": "~1.3.0", - "crc-32": "~1.2.0" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -2367,14 +2346,6 @@ "node": ">=6" } }, - "node_modules/codepage": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", - "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", - "engines": { - "node": ">=0.8" - } - }, "node_modules/color-alpha": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/color-alpha/-/color-alpha-1.0.4.tgz", @@ -2485,17 +2456,6 @@ "resolved": "https://registry.npmjs.org/country-regex/-/country-regex-1.1.0.tgz", "integrity": "sha512-iSPlClZP8vX7MC3/u6s3lrDuoQyhQukh5LyABJ3hvfzbQ3Yyayd4fp04zjLnfi267B/B2FkumcWWgrbban7sSA==" }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/css-font": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-font/-/css-font-1.2.0.tgz", @@ -3125,14 +3085,6 @@ "css-font": "^1.2.0" } }, - "node_modules/frac": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", - "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", - "engines": { - "node": ">=0.8" - } - }, "node_modules/fraction.js": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", @@ -4971,17 +4923,6 @@ "node": ">=0.10.0" } }, - "node_modules/ssf": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", - "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", - "dependencies": { - "frac": "~1.1.2" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/stack-trace": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", @@ -5511,22 +5452,6 @@ "get-canvas-context": "^1.0.1" } }, - "node_modules/wmf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", - "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/word": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", - "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", - "engines": { - "node": ">=0.8" - } - }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -5548,26 +5473,6 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, - "node_modules/xlsx": { - "version": "0.18.5", - "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz", - "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", - "dependencies": { - "adler-32": "~1.3.0", - "cfb": "~1.2.1", - "codepage": "~1.15.0", - "crc-32": "~1.2.1", - "ssf": "~0.11.2", - "wmf": "~1.0.1", - "word": "~0.3.0" - }, - "bin": { - "xlsx": "bin/xlsx.njs" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/xss": { "version": "1.0.14", "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz", diff --git a/frontend-components/tables/package.json b/frontend-components/tables/package.json index 7a00febd33d..96d0c9f7597 100644 --- a/frontend-components/tables/package.json +++ b/frontend-components/tables/package.json @@ -7,7 +7,7 @@ "dev": "vite", "build": "vite build", "build_tsc": "tsc && vite build", - "deploy": "npm run build && mv dist/index.html ../../cli/openbb_cli/assets/interactive/table.html", + "deploy": "npm run build && mv dist/index.html ../../openbb_platform/obbject_extensions/charting/openbb_charting/core/table.html", "preview": "vite preview" }, "dependencies": { @@ -30,7 +30,6 @@ "react-plotly.js": "^2.6.0", "react-table": "^7.8.0", "react-virtual": "^2.10.4", - "xlsx": "^0.18.5", "xss": "^1.0.14" }, "devDependencies": { diff --git a/frontend-components/tables/src/components/Table/Export.tsx b/frontend-components/tables/src/components/Table/Export.tsx index 5fbe97dca3e..c3084f0d84c 100644 --- a/frontend-components/tables/src/components/Table/Export.tsx +++ b/frontend-components/tables/src/components/Table/Export.tsx @@ -23,9 +23,6 @@ export default function Export({ case "csv": downloadData("csv", columns, data, downloadFinished); break; - case "xlsx": - downloadData("xlsx", columns, data, downloadFinished); - break; case "png": downloadImage("table", downloadFinished); break; diff --git a/frontend-components/tables/src/components/Table/index.tsx b/frontend-components/tables/src/components/Table/index.tsx index 8446893f1c8..e26b2361e09 100644 --- a/frontend-components/tables/src/components/Table/index.tsx +++ b/frontend-components/tables/src/components/Table/index.tsx @@ -112,7 +112,7 @@ function getCellWidth(row, column) { } } -export const EXPORT_TYPES = ["csv", "xlsx", "png"]; +export const EXPORT_TYPES = ["csv", "png"]; export default function Table({ data, columns, diff --git a/frontend-components/tables/src/index.css b/frontend-components/tables/src/index.css index 5c60db88159..eabb256040f 100644 --- a/frontend-components/tables/src/index.css +++ b/frontend-components/tables/src/index.css @@ -57,11 +57,10 @@ body { font-family: "Fira Code", monospace; } -/*table tbody { - display: block; - max-height: 300px; - overflow-y: scroll; -}*/ +table { + width: 100%; + table-layout: auto; +} table thead, table tfoot, @@ -69,16 +68,22 @@ table tbody tr { display: table; width: 100%; table-layout: fixed; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +th, td { + word-wrap: break-word; + overflow: hidden; + text-overflow: ellipsis; } .resizer { cursor: col-resize; user-select: none; touch-action: none; -} - -tr { - width: fit-content; + transition: opacity 0.2s ease-in-out; } .resizer.isResizing { @@ -162,7 +167,6 @@ table thead th { opacity: 1; } - @keyframes spin { 0% { transform: rotate(0deg); diff --git a/frontend-components/tables/src/utils/utils.ts b/frontend-components/tables/src/utils/utils.ts index 9ecc76d1bf4..42f8171e197 100644 --- a/frontend-components/tables/src/utils/utils.ts +++ b/frontend-components/tables/src/utils/utils.ts @@ -1,6 +1,6 @@ import { rankItem } from "@tanstack/match-sorter-utils"; import domtoimage from "dom-to-image"; -import { utils, writeFile } from "xlsx"; + export function formatNumberNoMagnitude(value: number | string) { if (typeof value === "string") { @@ -224,7 +224,7 @@ export const saveToFile = ( }; export async function downloadData( - type: "csv" | "xlsx", + type: "csv", columns: any, data: any, downloadFinished: (changed: boolean) => void, @@ -270,19 +270,6 @@ export async function downloadData( return; } - - const wb = utils.book_new(); - const ws = utils.aoa_to_sheet(csvData); - utils.book_append_sheet(wb, ws, "Sheet1"); - await loadingOverlay("Saving XLSX"); - non_blocking(async function () { - // @ts-ignore - // timeout to allow loading overlay to show - await new Promise((resolve) => setTimeout(resolve, 1500)); - writeFile(wb, `${window.title}.xlsx`); - await loadingOverlay("", true); - downloadFinished?.(true); - }, 2)(); } export async function downloadImage( diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/core/table.html b/openbb_platform/obbject_extensions/charting/openbb_charting/core/table.html index 3f1b2b40200..f7c7d048567 100644 --- a/openbb_platform/obbject_extensions/charting/openbb_charting/core/table.html +++ b/openbb_platform/obbject_extensions/charting/openbb_charting/core/table.html @@ -4,73 +4,7 @@ <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>OpenBB Interactive Tables</title> - <style> - table { - width: 100%; - table-layout: auto; - } - - th { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - - td { - word-break: break-all; - overflow: hidden; - text-overflow: ellipsis; - } - </style> - <script> - if (window.json_data && JSON.parse(window.json_data)?.posthog?.collect_logs) { - !function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.async=!0,p.src=s.api_host+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="capture identify alias people.set people.set_once set_config register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled onFeatureFlags".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]); - posthog.init("posthog-key-placeholder", { - api_host: "https://app.posthog.com", - autocapture: { - css_selector_allowlist: [".ph-capture"], - }, - capture_pageview: false, - loaded: function (posthog) { - if (window.json_data) { - const data = JSON.parse(window.json_data); - - const log_id = data?.log_id || ""; - if (log_id != "" && log_id != "REPLACE_ME") { - posthog.identify(log_id); - } - - posthog.capture("table", { - INFO: { - command: data.command_location, - title: data.title, - python_version: data.python_version, - pywry_version: data.pywry_version, - platform_version: data.platform_version, - }, - }); - } - posthog.onFeatureFlags(function () { - if ( - !posthog.isFeatureEnabled("record-pywry", { send_event: false }) - ) { - posthog.stopSessionRecording(); - } - if ( - !posthog.isFeatureEnabled("collect-logs-pywry", { - send_event: false, - }) - ) { - posthog.opt_out_capturing(); - } else if (posthog.has_opted_out_capturing()) { - posthog.opt_in_capturing(); - } - }); - }, - }); - } - if ( // check if user had saved dark as their // theme when accessing page before @@ -98,87 +32,87 @@ } </script> <script type="module" crossorigin> -function $y(e,t){for(var r=0;r<t.length;r++){const n=t[r];if(typeof n!="string"&&!Array.isArray(n)){for(const i in n)if(i!=="default"&&!(i in e)){const o=Object.getOwnPropertyDescriptor(n,i);o&&Object.defineProperty(e,i,o.get?o:{enumerable:!0,get:()=>n[i]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const a of o.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&n(a)}).observe(document,{childList:!0,subtree:!0});function r(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(i){if(i.ep)return;i.ep=!0;const o=r(i);fetch(i.href,o)}})();function qa(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var I1={exports:{}},Qa={};/* +function Zm(e,t){for(var n=0;n<t.length;n++){const r=t[n];if(typeof r!="string"&&!Array.isArray(r)){for(const o in r)if(o!=="default"&&!(o in e)){const i=Object.getOwnPropertyDescriptor(r,o);i&&Object.defineProperty(e,o,i.get?i:{enumerable:!0,get:()=>r[o]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))r(o);new MutationObserver(o=>{for(const i of o)if(i.type==="childList")for(const l of i.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&r(l)}).observe(document,{childList:!0,subtree:!0});function n(o){const i={};return o.integrity&&(i.integrity=o.integrity),o.referrerPolicy&&(i.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?i.credentials="include":o.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(o){if(o.ep)return;o.ep=!0;const i=n(o);fetch(o.href,i)}})();function xo(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var jf={exports:{}},Eo={};/* object-assign (c) Sindre Sorhus @license MIT -*/var Ch=Object.getOwnPropertySymbols,Ny=Object.prototype.hasOwnProperty,My=Object.prototype.propertyIsEnumerable;function Ly(e){if(e==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}function By(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de",Object.getOwnPropertyNames(e)[0]==="5")return!1;for(var t={},r=0;r<10;r++)t["_"+String.fromCharCode(r)]=r;var n=Object.getOwnPropertyNames(t).map(function(o){return t[o]});if(n.join("")!=="0123456789")return!1;var i={};return"abcdefghijklmnopqrst".split("").forEach(function(o){i[o]=o}),Object.keys(Object.assign({},i)).join("")==="abcdefghijklmnopqrst"}catch{return!1}}var b1=By()?Object.assign:function(e,t){for(var r,n=Ly(e),i,o=1;o<arguments.length;o++){r=Object(arguments[o]);for(var a in r)Ny.call(r,a)&&(n[a]=r[a]);if(Ch){i=Ch(r);for(var s=0;s<i.length;s++)My.call(r,i[s])&&(n[i[s]]=r[i[s]])}}return n},k1={exports:{}},be={};/** @license React v17.0.2 +*/var xc=Object.getOwnPropertySymbols,Jm=Object.prototype.hasOwnProperty,ev=Object.prototype.propertyIsEnumerable;function tv(e){if(e==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}function nv(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de",Object.getOwnPropertyNames(e)[0]==="5")return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;var r=Object.getOwnPropertyNames(t).map(function(i){return t[i]});if(r.join("")!=="0123456789")return!1;var o={};return"abcdefghijklmnopqrst".split("").forEach(function(i){o[i]=i}),Object.keys(Object.assign({},o)).join("")==="abcdefghijklmnopqrst"}catch{return!1}}var Bf=nv()?Object.assign:function(e,t){for(var n,r=tv(e),o,i=1;i<arguments.length;i++){n=Object(arguments[i]);for(var l in n)Jm.call(n,l)&&(r[l]=n[l]);if(xc){o=xc(n);for(var s=0;s<o.length;s++)ev.call(n,o[s])&&(r[o[s]]=n[o[s]])}}return r},Wf={exports:{}},ae={};/** @license React v17.0.2 * react.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var E0=b1,Eo=60103,$1=60106;be.Fragment=60107;be.StrictMode=60108;be.Profiler=60114;var N1=60109,M1=60110,L1=60112;be.Suspense=60113;var B1=60115,U1=60116;if(typeof Symbol=="function"&&Symbol.for){var mr=Symbol.for;Eo=mr("react.element"),$1=mr("react.portal"),be.Fragment=mr("react.fragment"),be.StrictMode=mr("react.strict_mode"),be.Profiler=mr("react.profiler"),N1=mr("react.provider"),M1=mr("react.context"),L1=mr("react.forward_ref"),be.Suspense=mr("react.suspense"),B1=mr("react.memo"),U1=mr("react.lazy")}var Ah=typeof Symbol=="function"&&Symbol.iterator;function Uy(e){return e===null||typeof e!="object"?null:(e=Ah&&e[Ah]||e["@@iterator"],typeof e=="function"?e:null)}function Za(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,r=1;r<arguments.length;r++)t+="&args[]="+encodeURIComponent(arguments[r]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var H1={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},V1={};function _o(e,t,r){this.props=e,this.context=t,this.refs=V1,this.updater=r||H1}_o.prototype.isReactComponent={};_o.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error(Za(85));this.updater.enqueueSetState(this,e,t,"setState")};_o.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function W1(){}W1.prototype=_o.prototype;function _0(e,t,r){this.props=e,this.context=t,this.refs=V1,this.updater=r||H1}var S0=_0.prototype=new W1;S0.constructor=_0;E0(S0,_o.prototype);S0.isPureReactComponent=!0;var T0={current:null},z1=Object.prototype.hasOwnProperty,G1={key:!0,ref:!0,__self:!0,__source:!0};function j1(e,t,r){var n,i={},o=null,a=null;if(t!=null)for(n in t.ref!==void 0&&(a=t.ref),t.key!==void 0&&(o=""+t.key),t)z1.call(t,n)&&!G1.hasOwnProperty(n)&&(i[n]=t[n]);var s=arguments.length-2;if(s===1)i.children=r;else if(1<s){for(var l=Array(s),u=0;u<s;u++)l[u]=arguments[u+2];i.children=l}if(e&&e.defaultProps)for(n in s=e.defaultProps,s)i[n]===void 0&&(i[n]=s[n]);return{$$typeof:Eo,type:e,key:o,ref:a,props:i,_owner:T0.current}}function Hy(e,t){return{$$typeof:Eo,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}function C0(e){return typeof e=="object"&&e!==null&&e.$$typeof===Eo}function Vy(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(r){return t[r]})}var Rh=/\/+/g;function qu(e,t){return typeof e=="object"&&e!==null&&e.key!=null?Vy(""+e.key):t.toString(36)}function Ks(e,t,r,n,i){var o=typeof e;(o==="undefined"||o==="boolean")&&(e=null);var a=!1;if(e===null)a=!0;else switch(o){case"string":case"number":a=!0;break;case"object":switch(e.$$typeof){case Eo:case $1:a=!0}}if(a)return a=e,i=i(a),e=n===""?"."+qu(a,0):n,Array.isArray(i)?(r="",e!=null&&(r=e.replace(Rh,"$&/")+"/"),Ks(i,t,r,"",function(u){return u})):i!=null&&(C0(i)&&(i=Hy(i,r+(!i.key||a&&a.key===i.key?"":(""+i.key).replace(Rh,"$&/")+"/")+e)),t.push(i)),1;if(a=0,n=n===""?".":n+":",Array.isArray(e))for(var s=0;s<e.length;s++){o=e[s];var l=n+qu(o,s);a+=Ks(o,t,r,l,i)}else if(l=Uy(e),typeof l=="function")for(e=l.call(e),s=0;!(o=e.next()).done;)o=o.value,l=n+qu(o,s++),a+=Ks(o,t,r,l,i);else if(o==="object")throw t=""+e,Error(Za(31,t==="[object Object]"?"object with keys {"+Object.keys(e).join(", ")+"}":t));return a}function ds(e,t,r){if(e==null)return e;var n=[],i=0;return Ks(e,n,"","",function(o){return t.call(r,o,i++)}),n}function Wy(e){if(e._status===-1){var t=e._result;t=t(),e._status=0,e._result=t,t.then(function(r){e._status===0&&(r=r.default,e._status=1,e._result=r)},function(r){e._status===0&&(e._status=2,e._result=r)})}if(e._status===1)return e._result;throw e._result}var X1={current:null};function sn(){var e=X1.current;if(e===null)throw Error(Za(321));return e}var zy={ReactCurrentDispatcher:X1,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:T0,IsSomeRendererActing:{current:!1},assign:E0};be.Children={map:ds,forEach:function(e,t,r){ds(e,function(){t.apply(this,arguments)},r)},count:function(e){var t=0;return ds(e,function(){t++}),t},toArray:function(e){return ds(e,function(t){return t})||[]},only:function(e){if(!C0(e))throw Error(Za(143));return e}};be.Component=_o;be.PureComponent=_0;be.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=zy;be.cloneElement=function(e,t,r){if(e==null)throw Error(Za(267,e));var n=E0({},e.props),i=e.key,o=e.ref,a=e._owner;if(t!=null){if(t.ref!==void 0&&(o=t.ref,a=T0.current),t.key!==void 0&&(i=""+t.key),e.type&&e.type.defaultProps)var s=e.type.defaultProps;for(l in t)z1.call(t,l)&&!G1.hasOwnProperty(l)&&(n[l]=t[l]===void 0&&s!==void 0?s[l]:t[l])}var l=arguments.length-2;if(l===1)n.children=r;else if(1<l){s=Array(l);for(var u=0;u<l;u++)s[u]=arguments[u+2];n.children=s}return{$$typeof:Eo,type:e.type,key:i,ref:o,props:n,_owner:a}};be.createContext=function(e,t){return t===void 0&&(t=null),e={$$typeof:M1,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null},e.Provider={$$typeof:N1,_context:e},e.Consumer=e};be.createElement=j1;be.createFactory=function(e){var t=j1.bind(null,e);return t.type=e,t};be.createRef=function(){return{current:null}};be.forwardRef=function(e){return{$$typeof:L1,render:e}};be.isValidElement=C0;be.lazy=function(e){return{$$typeof:U1,_payload:{_status:-1,_result:e},_init:Wy}};be.memo=function(e,t){return{$$typeof:B1,type:e,compare:t===void 0?null:t}};be.useCallback=function(e,t){return sn().useCallback(e,t)};be.useContext=function(e,t){return sn().useContext(e,t)};be.useDebugValue=function(){};be.useEffect=function(e,t){return sn().useEffect(e,t)};be.useImperativeHandle=function(e,t,r){return sn().useImperativeHandle(e,t,r)};be.useLayoutEffect=function(e,t){return sn().useLayoutEffect(e,t)};be.useMemo=function(e,t){return sn().useMemo(e,t)};be.useReducer=function(e,t,r){return sn().useReducer(e,t,r)};be.useRef=function(e){return sn().useRef(e)};be.useState=function(e){return sn().useState(e)};be.version="17.0.2";k1.exports=be;var x=k1.exports;const or=qa(x),Gy=$y({__proto__:null,default:or},[x]);/** @license React v17.0.2 + */var Ga=Bf,pr=60103,Gf=60106;ae.Fragment=60107;ae.StrictMode=60108;ae.Profiler=60114;var Kf=60109,Xf=60110,Yf=60112;ae.Suspense=60113;var qf=60115,Qf=60116;if(typeof Symbol=="function"&&Symbol.for){var nt=Symbol.for;pr=nt("react.element"),Gf=nt("react.portal"),ae.Fragment=nt("react.fragment"),ae.StrictMode=nt("react.strict_mode"),ae.Profiler=nt("react.profiler"),Kf=nt("react.provider"),Xf=nt("react.context"),Yf=nt("react.forward_ref"),ae.Suspense=nt("react.suspense"),qf=nt("react.memo"),Qf=nt("react.lazy")}var Ec=typeof Symbol=="function"&&Symbol.iterator;function rv(e){return e===null||typeof e!="object"?null:(e=Ec&&e[Ec]||e["@@iterator"],typeof e=="function"?e:null)}function $o(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var Zf={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Jf={};function gr(e,t,n){this.props=e,this.context=t,this.refs=Jf,this.updater=n||Zf}gr.prototype.isReactComponent={};gr.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error($o(85));this.updater.enqueueSetState(this,e,t,"setState")};gr.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function ep(){}ep.prototype=gr.prototype;function Ka(e,t,n){this.props=e,this.context=t,this.refs=Jf,this.updater=n||Zf}var Xa=Ka.prototype=new ep;Xa.constructor=Ka;Ga(Xa,gr.prototype);Xa.isPureReactComponent=!0;var Ya={current:null},tp=Object.prototype.hasOwnProperty,np={key:!0,ref:!0,__self:!0,__source:!0};function rp(e,t,n){var r,o={},i=null,l=null;if(t!=null)for(r in t.ref!==void 0&&(l=t.ref),t.key!==void 0&&( |